leetcode:1326. 灌溉花園的最少水龍頭數目(dp,困難)

cs-凌晨技術工作室發表於2020-10-05

題目:

在這裡插入圖片描述

分析:直接把水龍頭轉化為區間,那麼就是一道簡答的區間問題。

要全部覆蓋,那麼顯然要選擇某一位置開頭(或包含某一位置),然後可以向右達到的最大長度。

也就是一道穿著華麗外表的基礎題。

程式碼:

class Solution {
public:
    struct node{
        int x;
        int y;
    } nn[10005];
int n2=0;
static bool cmp(struct node &n1,struct node &n2)
{
 if(n1.x==n2.x) return n1.y<n2.y;
 return n1.x<n2.x;
} 
    int minTaps(int n, vector<int>& r) {
    //int n;
 //vector<int> r;
 for(int i=0;i<r.size();i++)
 {
  if(r[i]==0) continue;
  nn[n2].x=max(0,i-r[i]);
  nn[n2].y=min(n,i+r[i]);
  n2++;
 }
 sort(nn,nn+n2,cmp);
 int l=0;
 int ans=0;
 int n3=0;
 while(1)
 {
  if(l>=n) return ans;
  if(n2==n3) return -1;
  if(nn[n3].x>l) return -1;
  int maxx=nn[n3].y;
  n3++;
  while(n3<n2)
  {//找包含l且最大的。 
   if(nn[n3].x>l) break;
   maxx=max(nn[n3].y,maxx);
   n3++;
  } 
  l=maxx;
        ans++;
 }
    }
};

相關文章