leetcode:1574. 删除最短的子数组使剩余数组有序(中等,双指针)

题目:

leetcode:1574. 删除最短的子数组使剩余数组有序(中等,双指针)_第1张图片

分析:子数组是连续的,好的,答案很明确了。

要么留左边一部分,右边一部分。

要么都留

要么只留左边。

要么只留右边。

只说明删除中间的,还挺复杂的,

leetcode:1574. 删除最短的子数组使剩余数组有序(中等,双指针)_第2张图片

不能只移动左边的,

优化的双层循环。应该找到一种关系使得,一侧的指针移动时,另一侧的指针只需要单侧移动。

这是一个非常好的分析思路,也是列为精华的原因。

显然,同时向右边移动。很好。

代码:

class Solution {
public:
    int findLengthOfShortestSubarray(vector<int>& n) {
        //是否是递增的数列。
 if(n.size()==0||n.size()==1) return 0;
 int ok=1;
 int c1,c2;
 for(int i=1;i<n.size();i++)
 {
  if(n[i-1]<=n[i]) continue;
  ok=0;
  c1=i-1;
  break;
  } 
 if(ok) return 0;
 //0-c1   包含c1是增的。
 for(int i=n.size()-2;;i--)
 {
  if(n[i]<=n[i+1]) continue;
  c2=i+1;
  break;
 }
 //c2-结束 是增加的。
 //只有左边和右边的情况。
    int c=n.size(); 
 int maxx=min(c-(c1+1),c2);
   // cout<
    //cout<
 //考虑删除中间部分的情况。
 int j=c2;
 for(int i=0;i<=c1;i++)
 {
  while(1)
  {
   if(n[j]>=n[i]) break;
   j++;
   if(j==n.size()) return maxx;   
  }
  maxx=min(maxx,j-i-1);
 } 
 return maxx;
    }
};

你可能感兴趣的:(我认为的精华,双指针)