[ 題目描述 ]:
[ 思路 ]:
- 題目要求在一個一定能達到數組末尾的跳躍數組中(見55題 跳躍游戲),找出能夠跳到末尾的最小次數
- 要求次數最少,那肯定是選取能選步數中最大的數。也就是在當前能夠達到的距離中,選擇能夠達到的最遠的步數,即跳躍一次;然后在新的最遠的距離,再次探尋最大的距離;當能夠達到的最遠距離超過數組長度的時候,即跳躍完畢
- 運行如下
int jump(int* nums, int numsSize) {int jumps=0, len=0,maxlen=0;for (int i=0; i<numsSize-1;i++) {maxlen = fmax(maxlen, i+nums[i]); if (i == len) {jumps++; len = maxlen;}if(len>numsSize-1) break;}return jumps;
}
[ 優化 ]:
- 時間復雜度O(n),空間復雜度O(1)
[ 官方題解 ]:
- 一、反向查找出發位置,貪心de 選擇距離最后一個位置最遠的那個位置,也就是對應下標最小的那個位置。因此,我們可以從左到右遍歷數組,選擇第一個滿足要求的位置。
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;
}
- 二、正向查找可到達的最大位置,即上述方法