【LeetCode 55】【LeetCode 45】 跳跃游戏
55.?跳躍游戲
?
給定一個(gè)非負(fù)整數(shù)數(shù)組,你最初位于數(shù)組的第一個(gè)位置。
數(shù)組中的每個(gè)元素代表你在該位置可以跳躍的最大長(zhǎng)度。
判斷你是否能夠到達(dá)最后一個(gè)位置。
示例?1:
輸入: [2,3,1,1,4] 輸出: true 解釋: 從位置 0 到 1 跳 1 步, 然后跳 3 步到達(dá)最后一個(gè)位置。示例?2:
輸入: [3,2,1,0,4] 輸出: false 解釋: 無(wú)論怎樣,你總會(huì)到達(dá)索引為 3 的位置。但該位置的最大跳躍長(zhǎng)度是 0 , 所以你永遠(yuǎn)不可能到達(dá)最后一個(gè)位置。解法1:
貪心,遍歷所有的元素,維護(hù)的指標(biāo)為當(dāng)前能夠達(dá)到的最大值,該最大值由上一次跳躍的最大值和這次跳躍的距離取較大值
解法2
由于數(shù)組元素大于等于0,所以當(dāng)且僅當(dāng)數(shù)組中有0,才可能過(guò)不去;其他情況一定可以跳到終點(diǎn)。
因此找到數(shù)組中的0元素,對(duì)于每一個(gè)0元素,查看其是否可以過(guò)去;
重點(diǎn):不能過(guò)去的充要條件是:0元素之前所有元素的值不大于該元素與0元素的距離
#include<bits/stdc++.h> using namespace std; class Solution { public:bool canJump(vector<int>& nums) {int N=nums.size();if(N<=1) return true;if(nums[0]==0) return false;//點(diǎn)數(shù)N>1,不可能跳到終點(diǎn)for(int i=1;i!=N-1;i++){//遍歷:第2個(gè)點(diǎn)到倒數(shù)第2個(gè)點(diǎn)if(nums[i]==0){vector<int>subnums(nums.begin(),nums.begin()+i);if(!jumpZERO(subnums))return false;}}return true;}//bool private:bool jumpZERO(vector<int>& subnums){vector<int>::iterator it;for(it=subnums.begin();it!=subnums.end();it++){//當(dāng)前點(diǎn)可以跳到末尾0,就可以通過(guò)if(*it>(subnums.end()-it))return true;}return false;} }; int main(){int n;cin>>n;vector<int>a;for(int i=0;i<n;i++){int x;cin>>x;a.push_back(x);}Solution work;if(work.canJump(a))cout<<"true"<<endl;elsecout<<"false"<<endl; } /* 2 3 1 1 4 3 2 1 0 4 3 0 8 2 0 0 7 */45.?跳躍游戲 II
?
給定一個(gè)非負(fù)整數(shù)數(shù)組,你最初位于數(shù)組的第一個(gè)位置。
數(shù)組中的每個(gè)元素代表你在該位置可以跳躍的最大長(zhǎng)度。
你的目標(biāo)是使用最少的跳躍次數(shù)到達(dá)數(shù)組的最后一個(gè)位置。
示例:
輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最后一個(gè)位置的最小跳躍數(shù)是 2。從下標(biāo)為 0 跳到下標(biāo)為 1 的位置,跳?1步,然后跳?3 步到達(dá)數(shù)組的最后一個(gè)位置。這道題的要求是給定一整數(shù)數(shù)組,數(shù)組元素表示每次可以跳躍的最大距離。然后初始位置在數(shù)組的第一個(gè)元素,目的是以最少的步數(shù)到達(dá)最后元素。
這道題是Jump Game II,是其Jump Game的擴(kuò)展。
在Jump Game中,采用貪心的思路,采用reach變量維護(hù)能到達(dá)最遠(yuǎn)處,即為全局最優(yōu)解。當(dāng)遍歷到i的時(shí)候,局部最優(yōu)解為A[i]+i,因此,此時(shí)的全局最優(yōu)解即為reach和A[i]+i的最大值:reach = max(reach, A[i] + i)。
而這道題,需要求的是最少的步數(shù)。因此需要添加step變量記錄最少步數(shù)。至于什么時(shí)候step需要加1?答案是當(dāng)前的i超過(guò)了前一步的最遠(yuǎn)位置。所以引入last變量記錄上一步能到達(dá)的最遠(yuǎn)位置。reach、step、last的初始值均為0。當(dāng)遍歷到i的時(shí)候,如果i超過(guò)了last(即上一步能到達(dá)的最遠(yuǎn)位置),說(shuō)明步數(shù)需要加1(即step++),此時(shí)仍需要更新last為當(dāng)前最遠(yuǎn)位置reach。全程只需遍歷1次數(shù)組,而且空間復(fù)雜度為常量。
時(shí)間復(fù)雜度:O(n)
空間復(fù)雜度:O(1)
class Solution { public:int jump(vector<int>& nums) {int n=nums.size();int reach=0;int step=0;int last=0;//上一步能達(dá)到的最遠(yuǎn)位置for(int i=0;i<=reach&&i<n;i++){if(i>last){++step;last=reach;}reach=max(reach,nums[i]+i);}return reach>=n-1?step:0;} };?
總結(jié)
以上是生活随笔為你收集整理的【LeetCode 55】【LeetCode 45】 跳跃游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 牛客网 最短路 Floyd算法 Dijk
- 下一篇: HDU5178 pairs【二分法】【尺