日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

【LeetCode 55】【LeetCode 45】 跳跃游戏

發(fā)布時(shí)間:2024/10/8 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode 55】【LeetCode 45】 跳跃游戏 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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á)到的最大值,該最大值由上一次跳躍的最大值和這次跳躍的距離取較大值

  • 一定要遍歷所有的元素,而不是跳躍
  • maxreach的更新方法:max(上一次跳躍的最大值,本次跳躍的最大距離)
  • #include<bits/stdc++.h> using namespace std; class Solution { public:bool canJump(vector<int>& nums) {int N=nums.size();int maxreach=0;//注意是下標(biāo)值而不是元素值for(int i=0;i<N;i++){//maxreach停止了,i仍然在增加if(i>maxreach)return false;maxreach=max(maxreach,i+nums[i]);//更新if(maxreach>=N-1)return true;}}//bool }; 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 */

    解法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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。