給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。
示例:
輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
從下標爲 0 跳到下標爲 1 的位置,跳 1 步,然後跳 3 步到達數組的最後一個位置。
說明:假設你總是可以到達數組的最後一個位置。
思路
使用貪心的思想,每次搜索可以到達的最遠距離的下標
class Solution {
public:
int jump(vector<int>& nums) {
int size= nums.size(), sum= 0;
// 記錄可以到達的最遠的地方和開始的下標
int maxpos= 0, index;
for(int i= 0; i< size- 1; ){
maxpos= i, index= i;
for(int j= i; j- i<= nums[i]&& j< size- 1; ++j){
// 搜索最遠距離的下標
if(maxpos< j+ nums[j]){
maxpos= j+ nums[j];
index= j;
if(maxpos>= size- 1) break;
}
}
i= i== index? maxpos: index;
++sum;
if(index>= size- 1) break;
}
return sum;
}
};
參考官方題解對代碼進行了簡化
class Solution {
public:
int jump(vector<int>& nums) {
int size= nums.size(), sum= 0;
int maxpos= 0, end= 0;
// 搜索每段(i到end)的最遠距離
for(int i= 0; i< size- 1; ++i){
maxpos= max(maxpos, i+ nums[i]);
if(i== end){
end= maxpos;
++sum;
}
}
return sum;
}
};