国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【LeetCode - 每日一題】1654. 到家的最少跳躍次數(shù)(23.08.30)

這篇具有很好參考價值的文章主要介紹了【LeetCode - 每日一題】1654. 到家的最少跳躍次數(shù)(23.08.30)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1654. 到家的最少跳躍次數(shù)

題意

  • 可以左跳可以右跳
  • 不能連續(xù)左跳兩次
  • 不能跳到負數(shù)
  • 不能跳到 forbidden[]
  • 求可以跳到 x 的最少跳躍次數(shù)

code

a. overview
最初時,只有 0 位置可以進行跳躍;在跳到 a 位置后,又可以跳到 2a 位置和 a-b 位置(如果 a>b);然后又多了兩個位置(或者一個位置)可以跳躍…因此這是一個廣度優(yōu)先搜索問題
在搜索時,要注意:

  • 不能連續(xù)左跳兩次(因此要記錄上一跳的狀態(tài))
  • 不能跳到負數(shù)
  • 不能跳到 forbidden[]

b. 上限問題
雖然題目中確定了下限(為 0 ),但是沒有顯示說明上限,因此這里進行分類討論:

  • a = b。左跳可以抵消右跳,因此為了最短跳躍次數(shù),應當一直右跳,因此上限為 x(若超過 x 還沒到達,則永遠到達不了);
  • a > b。由于不能連續(xù)兩次左跳,因此一定是一直前進,上限為 x + b(若超過 x + b 還沒到達,則永遠回不到 x + b);
  • a < b。上限為 max(max(forbidden) + a + b, x)證明見力扣,看不懂。 實際做題的時候設為 6000 也能過。

一直超時,最后發(fā)現(xiàn),只有當 dp[cur] + 1 < dp[cur + a]dp[cur] + 1 < dp[cur - b](也就是發(fā)現(xiàn)了到達該點的更少的跳躍次數(shù)) 時才需要進行更新,這樣會減少很多冗余的處理。

class Solution {
public:
    int MAXN = 1e9+10;

    int minimumJumps(vector<int>& forbidden, int a, int b, int x) {
        int f = *max_element(forbidden.begin(), forbidden.end());
        int bound = max(x + b, a + b + f);
        vector<int> dp(bound + 1, MAXN); 	// 初始化為 MAXN,表示一開始所有點沒有到達,方便后面更新最小跳躍次數(shù)
        vector<int> direct(bound + 1, 0); 	// 記錄跳躍方向
        queue<int> q;

        dp[0] = 0; 	// 0 位置跳躍 0 次即可到達
        direct[0] = 1; 	// 0 位置只能向右跳
        
        for(int i = 0; i < forbidden.size(); i++) 	// forbidden 都不能到達
        {
            dp[forbidden[i]] = -1;
        }

        if(dp[0] == -1) return -1;

        q.push(0);
        int curLayerCnt = 1; // 為了計數(shù)跳躍次數(shù),這里做了一個記錄層數(shù)的層次遍歷
        int layer = 0;

        while(!q.empty())
        {
            int preLayerCnt = curLayerCnt;
            curLayerCnt = 0;
            
            while(preLayerCnt)
            {
                int cur = q.front();
                q.pop();
                preLayerCnt--;

                if(cur == x) return layer;

                // 處理當前點可到達的點

                // 不能連續(xù)向后跳兩次,所以要記錄跳的方向

                if(direct[cur] == 1)
                {
                    // 上一次向右跳,可以向左跳
                    if(cur >= b && dp[cur - b] != -1) 	// 沒超下限 且 可到達 -》向左跳
                    {
                        if(dp[cur] + 1 < dp[cur - b]) 	// 如果有更少的跳躍次數(shù),才更新
                        {
                            direct[cur - b] = -1;
                            dp[cur - b] = dp[cur] + 1;
                            curLayerCnt++;
                            q.push(cur - b);
                        }
                        
                    }
                }
                // 上一跳無論什么方向都可以向右跳
                if(cur + a <= bound && dp[cur + a] != -1 && dp[cur] + 1 < dp[cur + a])
                {
                    dp[cur + a] = dp[cur] + 1;
                    curLayerCnt++;
                    q.push(cur + a);
                    direct[cur + a] = 1;
                }
            }
            //cout<<layer<<" ";
            layer++;
        }
        return -1;
    }
};

復雜度

時間復雜度:O(max(max(forbidden) + a + b, x))
空間復雜度:O(max(max(forbidden) + a + b, x))文章來源地址http://www.zghlxwxcb.cn/news/detail-685852.html


到了這里,關于【LeetCode - 每日一題】1654. 到家的最少跳躍次數(shù)(23.08.30)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • leetcode每日一題——45.跳躍游戲II(面試經(jīng)典150題)

    45. 跳躍游戲 II - 力扣(LeetCode) 給定一個長度為 n 的 0 索引 整數(shù)數(shù)組 nums。 初始位置為 nums[0] 。 每個元素 nums[i] 表示從索引 i 向前跳轉(zhuǎn)的最大長度。換句話說,如果你在 nums[i] 處,你可以跳轉(zhuǎn)到任意 nums[i + j] 處:? ?0 = j = nums[i]? ? ?i + j n 返回到達?nums[n - 1] 的最小跳躍次數(shù)

    2024年02月13日
    瀏覽(26)
  • 每日一題leetcode--使循環(huán)數(shù)組所有元素相等的最少秒數(shù)

    每日一題leetcode--使循環(huán)數(shù)組所有元素相等的最少秒數(shù)

    相當于擴散,每個數(shù)可以一次可以擴散到左右讓其一樣,問最少多少次可以讓整個數(shù)組都變成一樣的數(shù) 使用枚舉,先將所有信息存到hash表中,然后逐一進行枚舉,計算時間長短用看下圖 ?考慮到環(huán)形數(shù)組,可以把首項+n放到最后,這樣for循環(huán)就相當于前后可以聯(lián)通 貼一張別

    2024年02月12日
    瀏覽(22)
  • LeetCode每日一題:2594. 修車的最少時間(2023.9.7 C++)

    目錄 2594. 修車的最少時間 題目描述: 實現(xiàn)代碼與解析: 二分 原理思路: ????????給你一個整數(shù)數(shù)組? ranks ?,表示一些機械工的? 能力值 ?。 ranksi ?是第? i ?位機械工的能力值。能力值為? r ?的機械工可以在? r * n2 ?分鐘內(nèi)修好? n ?輛車。 同時給你一個整數(shù)? cars

    2024年02月09日
    瀏覽(30)
  • 【LeetCode每日一題】2809. 使數(shù)組和小于等于 x 的最少時間

    【LeetCode每日一題】2809. 使數(shù)組和小于等于 x 的最少時間

    2024-1-19 2809. 使數(shù)組和小于等于 x 的最少時間 思路: 獲取兩個列表的長度n,并初始化一個二維數(shù)組f,用于存儲最優(yōu)解。 定義一個二維數(shù)組nums,用于存儲輸入的兩個列表中的元素,并按照第二列元素進行排序。 使用動態(tài)規(guī)劃的方法,通過遍歷nums數(shù)組,計算最優(yōu)解。其中,

    2024年01月21日
    瀏覽(25)
  • (數(shù)組) 1207. 獨一無二的出現(xiàn)次數(shù) ——【Leetcode每日一題】

    (數(shù)組) 1207. 獨一無二的出現(xiàn)次數(shù) ——【Leetcode每日一題】

    難度:簡單 給你一個整數(shù)數(shù)組 arr ,請你幫忙統(tǒng)計數(shù)組中每個數(shù)的出現(xiàn)次數(shù)。 如果每個數(shù)的出現(xiàn)次數(shù)都是獨一無二的,就返回 true ;否則返回 false 。 示例 1: 輸入:arr = [1,2,2,1,1,3] 輸出:true 解釋:在該數(shù)組中,1 出現(xiàn)了 3 次,2 出現(xiàn)了 2 次,3 只出現(xiàn)了 1 次。沒有兩個數(shù)的出

    2024年02月08日
    瀏覽(16)
  • 每日一題——LeetCode1287.有序數(shù)組中出現(xiàn)次數(shù)超過25%的元素

    每日一題——LeetCode1287.有序數(shù)組中出現(xiàn)次數(shù)超過25%的元素

    方法一 一次循環(huán)統(tǒng)計 題目給出的數(shù)據(jù)相同的元素都是相鄰的,那么直接從頭開始遍歷,統(tǒng)計每種元素出現(xiàn)次數(shù),當有元素次數(shù)超過arr.length/4即為要求的元素 ? 消耗時間和內(nèi)存情況: 方法二 方法一簡化版 設步長step=arr.length/4,如果某個元素arr[i],跨越一個步長后arr[i+step],即

    2024年01月22日
    瀏覽(27)
  • 2023-06-14 LeetCode每日一題(二進制字符串前綴一致的次數(shù))

    點擊跳轉(zhuǎn)到題目位置 給你一個長度為 n 、下標從 1 開始的二進制字符串,所有位最開始都是 0 。我們會按步翻轉(zhuǎn)該二進制字符串的所有位(即,將 0 變?yōu)?1)。 給你一個下標從 1 開始的整數(shù)數(shù)組 flips ,其中 flips[i] 表示對應下標 i 的位將會在第 i 步翻轉(zhuǎn)。 二進制字符串 前綴

    2024年02月08日
    瀏覽(98)
  • 【每日一題】Leetcode - 劍指 Offer 43. 1~n 整數(shù)中 1 出現(xiàn)的次數(shù)

    【每日一題】Leetcode - 劍指 Offer 43. 1~n 整數(shù)中 1 出現(xiàn)的次數(shù)

    Leetcode - 劍指 Offer 43. 1~n 整數(shù)中 1 出現(xiàn)的次數(shù) 分解數(shù)字中的每一位,判斷+記錄 = 結果 But,超時了,下面是優(yōu)化過程簡介 空間換時間(爆內(nèi)存) :n = 123456,則n{len-1} = 12345,其實走到n這里,說明n{len-1}這個數(shù)字我們一定已經(jīng)知道了它有多少個1了,所以我們只需要記錄保存下

    2024年02月11日
    瀏覽(19)
  • 【LeetCode每日一題】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)

    【LeetCode每日一題】2645. 構造有效字符串的最少插入數(shù)(計算組數(shù)+動態(tài)規(guī)劃+考慮相鄰字母)

    2024-1-11 2645. 構造有效字符串的最少插入數(shù) 方法一:計算組數(shù) 1.用count統(tǒng)計,能構成幾組abc 2.如果當前字符大于之前字符,說明還在組內(nèi),不更新 3.如果當前字符小于等于之前字符,說明不是同一組的abc,組數(shù)更新 4.最終返回值:組數(shù)*3,再減去原本的字符數(shù),就是要插入的次數(shù)

    2024年01月17日
    瀏覽(23)
  • 2023-08-23 LeetCode每日一題(統(tǒng)計點對的數(shù)目)

    2023-08-23 LeetCode每日一題(統(tǒng)計點對的數(shù)目)

    點擊跳轉(zhuǎn)到題目位置 給你一個無向圖,無向圖由整數(shù) n ,表示圖中節(jié)點的數(shù)目,和 edges 組成,其中 edges[i] = [u i , v i ] 表示 u i 和 v i 之間有一條無向邊。同時給你一個代表查詢的整數(shù)數(shù)組 queries 。 第 j 個查詢的答案是滿足如下條件的點對 (a, b) 的數(shù)目: a b cnt 是與 a 或者 b

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包