[貪心法]leetcode1326:灌溉花園的最少水龍頭數目(hard)

題目:

5318. 灌溉花園的最少水龍頭數目

題解:

  • 貪心法
  • 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章