執行結果:通過
執行用時和內存消耗如下:
?
?
?
int jump(int* nums, int numsSize) {int position = numsSize - 1;int steps = 0;while (position > 0) {for (int i = 0; i < position; i++) {if (i + nums[i] >= position) {position = i;steps++;break;}}}return steps;
}
解題思路:
這段代碼是用來解決“跳躍游戲 II”(Jump Game II)的問題,目標是最小化跳躍次數,從數組的起始位置跳到最后一個位置。代碼的思路可以分解為以下幾個步驟:
- 初始化變量:
position
:設置為數組的最后一個位置(numsSize - 1
),表示當前需要到達的目標位置。steps
:設置為0,用來記錄跳躍的次數。
- 逆向思維:
- 代碼采用了逆向思維,從數組的最后一個位置開始向前推算,直到到達數組的第一個位置。這種方法相較于正向推算,可以減少不必要的比較,因為從后向前更容易確定哪些位置可以一步跳到當前的目標位置。
- 尋找能夠跳到目標位置的最遠起點:
- 使用一個
while
循環,條件是position > 0
,意味著只要目標位置不是數組的起始位置,就繼續尋找。 - 在
while
循環內部,使用一個for
循環遍歷當前目標位置之前的所有位置(從0到position - 1
)。 - 在
for
循環內部,檢查每個位置i
是否能通過一次跳躍到達或超過當前的目標位置position
(即i + nums[i] >= position
)。 - 一旦找到這樣的位置
i
,更新目標位置position
為i
(即新的目標位置變為當前能夠跳到之前目標位置的最遠起點),跳躍次數steps
增加1,然后跳出for
循環。
- 使用一個
- 返回結果:
- 當
while
循環結束時,說明已經從最后一個位置逆向推算到了第一個位置,此時steps
記錄的就是最小跳躍次數。 - 返回
steps
作為結果。
- 當
總結來說,這段代碼通過逆向遍歷數組,從后向前尋找每個目標位置的最遠可達起點,從而計算出從數組起始位置跳到最后一個位置所需的最小跳躍次數。