題目:
題解:
- 貪心法
- 1:首先遍歷rangs,建立45. 跳躍遊戲 Ⅱ中的跳躍數組,left表示起始點,right-left表示最大跳躍距離
- 2:使用跳躍遊戲Ⅱ中的代碼即可,不過每次到達邊界end,需判斷furthest是否超過end
代碼如下:
class Solution {
public:
//題解:貪心法
//1:首先遍歷rangs,建立跳躍遊戲Ⅱ中的跳躍數組,left表示起始點,right-left表示最大跳躍距離
//2:使用跳躍遊戲Ⅱ中的代碼即可,不過每次到達邊界end,需判斷furthest是否超過end
int minTaps(int n, vector<int>& ranges) {
//1、建立跳躍數組
vector<int> jumps(n+1);
for(int i=0;i<n+1;++i){
int left=max(i-ranges[i],0);
int right=min(i+ranges[i],n);
if(jumps[left]<right-left){
jumps[left]=right-left;
}
}
//2、貪心法跳躍
int furthest=0,end=0,count=0;
for(int i=0;i<n;++i){//注意最後一個點不能遍歷,因爲在i==end==0時,count多統計了一次
furthest=max(jumps[i]+i,furthest);
if(furthest>=n){
count++;
break;
}
if(i==end){
//若最遠距離沒有超過邊界,直接返回-1
if(furthest<=end)return -1;
count++;
end = furthest;
}
}
return count;
}
};