2 跳躍遊戲 c

2021-09-25 06:24:55 字數 1719 閱讀 3113

有一段直線距離,這段距離上分布著 n 個 格仔

每個位置上都標有數字,表示可以從這個格仔往前最多跳躍幾格

最少跳幾步,可以從起點跳到終點?

如上圖就是需要從a點跳到c點

在a點,可以往前最多跳2格,也就是在a點 可以往前跳一格或者兩格

b點就可以看成乙個坑,像上圖這個例子中,這個坑就是沒辦法逾越的,所以沒辦法跳到終點

這道題目被歸類為貪心演算法

貪心演算法都有個貪心思想

既然我需要得到最少跳幾步,那麼我就死活不跳

到了不得不跳的時候,再挑乙個跳的最遠的位置,來跳

定義a為當前格仔,b為當前格仔能到的最遠距離

像上面這個例子

把a點看成 a,把a點能跳到的最遠距離看成 b(也就是第三個位置)

什麼叫不得不跳?

a只能走一步或者兩步,而我現在就在a點,那麼就要考慮在(a,b] 這段距離內

哪個格仔能夠盡可能地跳的更遠,而且一定要選乙個格仔跳

也就是每次來到乙個新格仔,就要考察(a,b] 那個格仔能跳的更遠

所以這裡的貪心思想是:不得不跳我再跳,跳了我就選最大的跳

這裡我們可能會思考這個「坑」怎麼考慮,因為每次選最好的格仔跳

最後如果最遠只能跳到乙個坑里,那自然就是沒法越過這個坑,返回失敗即可

這裡我們的jumpgame2()方法返回的是最少需要跳幾步

600是設定的跳到坑中的情況

int main()
current_index存放的是 當前這個格仔 能到達的最遠距離

pre_index存放的是 (a,b]之間的格仔 能去往的最遠距離

每次指標掃瞄到current_index+1的時候,也就是不得不做選擇

在(a,b]之間選擇乙個能夠跳的最遠的格仔進行跳遠的時候

不得不跳,又只能跳到坑中,之間返回入坑(這裡用自己設定的錯誤碼600)

不是做選擇的時候,就是挑選(a,b]之間最好的格仔,等到不得不跳的時候,就選這個格仔來跳

當然,這裡還設定了乙個小trick,當我在掃瞄(a,b]的時候

發現有個格仔能直接到達或者超過終點,直接選這個節點就對了,也算是小小的貪心,後面的都不考慮了

為什麼跳兩步,就是跳過被選中的節點,再跳到終點,是兩步

class solution

//看pre_index 能否被超過

if(pre_index < i+steps[i])

}} if(pre_index < steps.size()-1)

return 600;

return times;

}};

3.完整**

#include #include using namespace std;

class solution

//看pre_index 能否被超過

if(pre_index < i+steps[i])

}} }

};int main()

有一些貪心演算法的題目的貪心思想就是

我要盡量貪心,就要用最少的資源做最好的事情

怎麼用最少的資源呢?就是不得不用,我再去用,這個很關鍵

分析題目的時候,要找到那個不得不用的時刻,題目就自然得解

跳躍遊戲1和2

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 從位置 0 到 1 跳 1 步,然後跳 3 步到達最後乙個位置。示例 2 輸入 3,2,1,0,4 輸出 fa...

跳躍遊戲2 計蒜課

給定乙個非負整數陣列,假定你的初始位置為陣列第乙個下標。陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。你的目標是到達最後乙個下標,並且使用最少的跳躍次數。例如 a 2,3,1,1,4 a 2,3 1,1 4 到達最後乙個下標的最少跳躍次數為 2 2。先跳躍 1 1 步,從下標 0 0 到 1 ...

LeetCoda 45 跳躍遊戲2

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。你的目標是使用最少的跳躍次數到達陣列的最後乙個位置。示例 輸入 2,3,1,1,4 輸出 2 解釋 跳到最後乙個位置的最小跳躍數是 2。從下標為 0 跳到下標為 1 的位置,跳1步,然後跳 3步到達陣...