亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++實現LeetCode(45.跳躍游戲之二)

 更新時間:2021年07月12日 15:42:59   作者:Grandyang  
這篇文章主要介紹了C++實現LeetCode(45.跳躍游戲之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下

[LeetCode] 45. Jump Game II 跳躍游戲之二

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Your goal is to reach the last index in the minimum number of jumps.

Example:

Input: [2,3,1,1,4]
Output: 2
Explanation: The minimum number of jumps to reach the last index is 2.
Jump 1 step from index 0 to 1, then 3 steps to the last index.

Note:

You can assume that you can always reach the last index.

這題是之前那道 Jump Game 的延伸,那題是問能不能到達最后一個數字,而此題只讓求到達最后一個位置的最少跳躍數,貌似是默認一定能到達最后位置的? 此題的核心方法是利用貪婪算法 Greedy 的思想來解,想想為什么呢? 為了較快的跳到末尾,想知道每一步能跳的范圍,這里貪婪并不是要在能跳的范圍中選跳力最遠的那個位置,因為這樣選下來不一定是最優(yōu)解,這么一說感覺又有點不像貪婪算法了。其實這里貪的是一個能到達的最遠范圍,遍歷當前跳躍能到的所有位置,然后根據該位置上的跳力來預測下一步能跳到的最遠距離,貪出一個最遠的范圍,一旦當這個范圍到達末尾時,當前所用的步數一定是最小步數。需要兩個變量 cur 和 pre 分別來保存當前的能到達的最遠位置和之前能到達的最遠位置,只要 cur 未達到最后一個位置則循環(huán)繼續(xù),pre 先賦值為 cur 的值,表示上一次循環(huán)后能到達的最遠位置,如果當前位置i小于等于 pre,說明還是在上一跳能到達的范圍內,根據當前位置加跳力來更新 cur,更新 cur 的方法是比較當前的 cur 和 i + A[i] 之中的較大值,如果題目中未說明是否能到達末尾,還可以判斷此時 pre 和 cur 是否相等,如果相等說明 cur 沒有更新,即無法到達末尾位置,返回 -1,代碼如下:

解法一:

class Solution {
public:
    int jump(vector<int>& nums) {
        int res = 0, n = nums.size(), i = 0, cur = 0;
        while (cur < n - 1) {
            ++res;
            int pre = cur;
            for (; i <= pre; ++i) {
                cur = max(cur, i + nums[i]);
            }
            if (pre == cur) return -1; // May not need this
        }
        return res;
    }
};

還有一種寫法,跟上面那解法略有不同,但是本質的思想還是一樣的,這里 cur 是當前能到達的最遠位置,last 是上一步能到達的最遠位置,遍歷數組,首先用 i + nums[i] 更新 cur,這個在上面解法中講過了,然后判斷如果當前位置到達了 last,即上一步能到達的最遠位置,說明需要再跳一次了,將 last 賦值為 cur,并且步數 res 自增1,這里小優(yōu)化一下,判斷如果 cur 到達末尾了,直接 break 掉即可,代碼如下:

解法二:

class Solution {
public:
    int jump(vector<int>& nums) {
        int res = 0, n = nums.size(), last = 0, cur = 0;
        for (int i = 0; i < n - 1; ++i) {
            cur = max(cur, i + nums[i]);
            if (i == last) {
                last = cur;
                ++res;
                if (cur >= n - 1) break;
            }
        }
        return res;
    }
};

到此這篇關于C++實現LeetCode(45.跳躍游戲之二)的文章就介紹到這了,更多相關C++實現跳躍游戲之二內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++中的基類和派生類構造函數示例詳解

    C++中的基類和派生類構造函數示例詳解

    這篇文章主要介紹了C++的基類和派生類構造函數,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • C++實現LeetCode(211.添加和查找單詞-數據結構設計)

    C++實現LeetCode(211.添加和查找單詞-數據結構設計)

    這篇文章主要介紹了C++實現LeetCode(211.添加和查找單詞-數據結構設計),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C++實現日期類(Date類)的方法

    C++實現日期類(Date類)的方法

    下面小編就為大家?guī)硪黄狢++實現日期類(Date類)的方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++如何實現廣義表詳解

    C++如何實現廣義表詳解

    廣義表是非線性結構,其定義是遞歸的。那么下面跟著小編一起看看如何用C++實現廣義表,有需要的可以參考借鑒。
    2016-08-08
  • 詳解為什么指針被譽為C語言靈魂

    詳解為什么指針被譽為C語言靈魂

    說到指針,就不可能脫離開內存,學會指針的人分為兩種,一種是不了解內存模型,另外一種則是了解。不了解的對指針的理解就停留在“指針就是變量的地址”這句話,會比較害怕使用指針,特別是各種高級操作。本文將帶你詳細了解C語言指針
    2021-06-06
  • C++實現猜數字小游戲

    C++實現猜數字小游戲

    這篇文章主要為大家詳細介紹了C++實現猜數字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Qt鍵盤事件實現圖片在窗口上下左右移動

    Qt鍵盤事件實現圖片在窗口上下左右移動

    這篇文章主要為大家詳細介紹了Qt鍵盤事件實現圖片在窗口上下左右移動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言實現數組移位、前移、后移與整體移動實例代碼

    C語言實現數組移位、前移、后移與整體移動實例代碼

    C語言中通??梢允褂醚h(huán)語句實現數組的移動,下面這篇文章主要給大家介紹了關于C語言實現數組移位、前移、后移與整體移動的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • C++實現數據文件存儲與加載

    C++實現數據文件存儲與加載

    這篇文章主要為大家詳細介紹了C++實現數據文件存儲與加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • VC實現五子棋游戲的一個算法示例

    VC實現五子棋游戲的一個算法示例

    這篇文章主要介紹了VC實現五子棋游戲的一個算法示例,對于學習數據結構與算法的朋友有一定的借鑒價值,需要的朋友可以參考下
    2014-08-08

最新評論