給定一個非負整數數組,你最初位於數組的第一個位置。
數組中的每個元素代表你在該位置可以跳躍的最大長度。
你的目標是使用最少的跳躍次數到達數組的最後一個位置。
示例:
輸入: [2,3,1,1,4] 輸出: 2 解釋: 跳到最後一個位置的最小跳躍數是2
。 從下標爲 0 跳到下標爲 1 的位置,跳1
步,然後跳3
步到達數組的最後一個位置。
說明:
假設你總是可以到達數組的最後一個位置。
class Solution {
public:
int jump(vector<int>& nums) {
/*
對於這道題目的話,首先這道題目可以看出來 假設F(x) 爲 能跳到的最遠的距離
那麼 F(x) 爲分段函數,舉個例子
0,1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4
第 0個格子只需要 0步就可以跳的到;
第 1到3 個格子需要1 步就可以跳的到
第4 到7 個格子可以兩個步驟就可以跳的到
*/
int left =0; //因此在這裏我們利用一個區間搜索的形式來進行搜索 left左邊界,right 右邊界
int right =0;
int temp =0;
if(nums.size() ==1){
return 0;
}
while (left <=right){//最開始的時候 leftleft==right==0
int max_dist =0; //最開始的時候我們利用一個變量來代表當前區間內最遠能到的距離
for(int i=left;i<=right; i++){
max_dist = max(max_dist, nums[i] + i);
}
left = right +1;//在這裏不斷地更新左邊界和右邊界;
right = max_dist;
temp ++;//步數 +1
if(right >= (int) nums.size()-1) {
break;//當最後的數據已經在我們當前區間能到達的最遠範圍的時候,就停止,用 break;
}
}
return temp;
}
};
//加油,加油,Try to make yourself more excellent...