欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實現LeetCode(55.跳躍游戲)

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

[LeetCode] 55. Jump Game 跳躍游戲

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.

Determine if you are able to reach the last index.

Example 1:

Input: [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

Example 2:

Input: [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum
jump length is 0, which makes it impossible to reach the last index.

這道題說的是有一個非負整數的數組,每個數字表示在當前位置的最大跳力(這里的跳力指的是在當前位置為基礎上能到達的最遠位置),求判斷能不能到達最后一個位置,開始博主以為是必須剛好到達最后一個位置,超過了不算,其實是理解題意有誤,因為每個位置上的數字表示的是最大的跳力而不是像玩大富翁一樣搖骰子搖出幾一定要走幾。這里可以用動態(tài)規(guī)劃 Dynamic Programming 來解,維護一個一維數組 dp,其中 dp[i] 表示達到i位置時剩余的跳力,若到達某個位置時跳力為負了,說明無法到達該位置。接下來難點就是推導狀態(tài)轉移方程啦,想想啊,到達當前位置的剩余跳力跟什么有關呢,其實是跟上一個位置的剩余跳力(dp 值)和上一個位置新的跳力(nums 數組中的值)有關,這里新的跳力就是原數組中每個位置的數字,因為其代表了以當前位置為起點能到達的最遠位置。所以當前位置的剩余跳力(dp 值)和當前位置新的跳力中的較大那個數決定了當前能到的最遠距離,而下一個位置的剩余跳力(dp 值)就等于當前的這個較大值減去1,因為需要花一個跳力到達下一個位置,所以就有狀態(tài)轉移方程了:dp[i] = max(dp[i - 1], nums[i - 1]) - 1,如果當某一個時刻 dp 數組的值為負了,說明無法抵達當前位置,則直接返回 false,最后循環(huán)結束后直接返回 true  即可,參見代碼如下:

解法一:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        vector<int> dp(nums.size(), 0);
        for (int i = 1; i < nums.size(); ++i) {
            dp[i] = max(dp[i - 1], nums[i - 1]) - 1;
            if (dp[i] < 0) return false;
        }
        return true;
    }
};

其實這題最好的解法不是 DP,而是貪婪算法 Greedy Algorithm,因為這里并不是很關心每一個位置上的剩余步數,而只希望知道能否到達末尾,也就是說我們只對最遠能到達的位置感興趣,所以維護一個變量 reach,表示最遠能到達的位置,初始化為0。遍歷數組中每一個數字,如果當前坐標大于 reach 或者 reach 已經抵達最后一個位置則跳出循環(huán),否則就更新 reach 的值為其和 i + nums[i] 中的較大值,其中 i + nums[i] 表示當前位置能到達的最大位置,參見代碼如下:

解法二:

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

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

相關文章

  • 詳解C++編程中類的聲明和對象成員的引用

    詳解C++編程中類的聲明和對象成員的引用

    這篇文章主要介紹了詳解C++編程中類的聲明和對象成員的引用,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • C語言數據結構之鏈隊列的基本操作

    C語言數據結構之鏈隊列的基本操作

    這篇文章主要為大家介紹了C語言之鏈隊列的基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Matlab制作視頻并轉換成gif動態(tài)圖的兩種方法

    Matlab制作視頻并轉換成gif動態(tài)圖的兩種方法

    這篇文章主要介紹了Matlab制作視頻并轉換成gif動態(tài)圖的兩種方法,第一種方法使用movie(f)直接取生成AVI視頻文件,相對來說比較簡單,需要的朋友可以參考下
    2018-08-08
  • Qt?5.9使用VTK顯示點云的詳解詳解

    Qt?5.9使用VTK顯示點云的詳解詳解

    這篇文章主要介紹了Qt?5.9使用VTK顯示點云,主要包括PCL安裝及在VS2013中使用PCL的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Visual?Studio2022報錯無法打開源文件?"openssl/conf.h"解決方法

    Visual?Studio2022報錯無法打開源文件?"openssl/conf.h"解決方法

    這篇文章主要介紹了Visual?Studio2022報錯無法打開源文件"openssl/conf.h"解決方式,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • C 語言中strstr函數實例詳解

    C 語言中strstr函數實例詳解

    這篇文章主要介紹了C 語言中strstr函數實例詳解的相關資料,需要的朋友可以參考下
    2017-07-07
  • C++索引越界的解決方法

    C++索引越界的解決方法

    本文主要介紹了C++索引越界的解決方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言將24小時制轉換為12小時制的方法

    C語言將24小時制轉換為12小時制的方法

    這篇文章主要介紹了C語言將24小時制轉換為12小時制的方法,涉及C語言針對時間的相關操作技巧,非常簡單實用,需要的朋友可以參考下
    2015-07-07
  • C++中volatile和mutable關鍵字用法詳解

    C++中volatile和mutable關鍵字用法詳解

    這篇文章主要介紹了C++中volatile和mutable關鍵字用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C++實現簡單猜數字小游戲

    C++實現簡單猜數字小游戲

    這篇文章主要為大家詳細介紹了C++實現簡單猜數字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論