45. 跳躍遊戲 II
時間:2020年12月3日
知識點:貪心
題目連結:https://leetcode-cn.com/problems/jump-game-ii/
題目
給定一個非負整數數組,你最初位于數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目标是使用最少的跳躍次數到達數組的最後一個位置。
示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
從下标為 0 跳到下标為 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。
說明:
假設你總是可以到達數組的最後一個位置。
解法:
- 看起來是一道動态規劃的題,實際上是貪心
- 這裡要搞明白 什麼時候需要步數+1 這裡維護兩個數
- 第一個是在目前情況下 能走到的最大距離
- 第二個是 下一步能走到的最大距離
- 首先看第一個數 目前能走到最大的距離為0 下一步能走的距離範圍在[0,i+nums[i]]
- 必須走這一步 ans++ 更新目前能走距離為[0,i+nums[i]] 如果目前能走到的距離 > 最後一個 就傳回
- 否則 繼續走 在目前能走的距離中 更新下一步能走的最大值 确定在[0,i+nums[i]] 到底選哪個地方走 該題不需要 能走到就行
- 重點: 每次走到目前能走的距離末尾 需要更新最大能走的地方
- 注意末尾的判斷
代碼
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int jump(vector<int>& nums) {
int end = nums.size()-1;
int cur_max_idx = 0;
int next_max_idx = 0;
int ans = 0;
for(int i = 0; i < nums.size(); i++){
next_max_idx = max(i+nums[i],next_max_idx);
if(cur_max_idx >= end)
break;
if(i == cur_max_idx){
ans ++;
cur_max_idx = next_max_idx;
}
}
return ans;
}
};
int main()
{
vector<int> nums{2,3,1,1,4};
Solution s;
cout<<s.jump(nums)<<endl;
return 0;
}
今天也是愛zz的一天哦!