recap 322 目前金額 → 拿coin → 扣掉 → 查前面dp → +1 → min。
55:從這格最多可以往右跳幾步
class Solution {
public:
bool canJump(vector<int>& nums) {//能否到最後格
int farthest = 0;//目前最遠可到index
for (int current = 0; current < nums.size(); ++current) {//從左到右檢查每一格
if (current > farthest)//目前位置已超可到範圍
return false;//走不到這裡,直接失敗
farthest = max(farthest, current + nums[current]);//更新目前最遠能到哪
if (farthest >= nums.size() - 1)//已經能到最後一格
return true;// 直接ok
}
return true;//全走完也表已到
}
};
4.有一點像417 Pacific Atlantic同問現在這格能否到下一範圍(先定義能不能走,再依規則更新可達範圍),但55就只有一路比較目前最遠能到哪,所以核心是比大小、更新最大值。
但這題不是比高度,而是比:current + nums[current]誰能把 farthest 推得更遠;所以核心確實是持續比較並保留目前最遠距離。
5.確認合法範圍是演算法常態:Grid 題看有沒有超出邊界,Jump Game看current > farthest,本質都是先確認這一步是不是還在可達/合法範圍內
目前位置是否合法、有無超出可達範圍、有無超出陣列邊界,在 Array、Graph、BFS、DFS、Greedy都常出現。
6.不用真的決定每一步怎麼跳,只維護最遠能到哪裡這一個狀態。這就是 Greedy(貪婪演算法)的重點。
7.nums = [2,3,1]
一開始:
current = 0
farthest = 0
看 nums[0] = 2:
current + nums[current]
= 0 + 2
= 2
所以:farthest = 2
->從index 0出發,現在知道最遠可以到index2
此時不用真的決定:0 → 1還是0 → 2只要知道:最遠能到 2就夠了。
接著看 index 1:1 + nums[1] = 1 + 3 = 4
可以先看一下第八點再釐清一下:)
所以:
farthest = max(2,4)
= 4
又把可達範圍推更遠。
Greedy 在這題就是:每到一格,只保留「目前能到的最遠位置」,不去模擬所有跳法。
8.想到跳棋:現在站在哪個index + 這格最多能跳多遠 = 從這格最遠能到哪裡。
nums = [2,3,1]
index 0 1 2
value 2 3 1
所以:
index 0:
0 + nums[0]
= 0 + 2
= 最遠到 index 2
再來看 index 1:
1 + nums[1]
= 1 + 3
= 最遠到 index 4
不是說「一定從 0 跳到 1」,而是:只要 index 1 本身在目前可達範圍內,就可以拿它來繼續更新更遠的範圍。