有一段直線距離,這段距離上分布著 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步到達陣...