1574. 删除最短的子数组使剩余数组有序

在这里插入图片描述
题目链接
解题思路:

从后往前遍历找到,不有序点,假设删除之前的所有元素
从前往后遍历,找到删除中间的序列,这里的序列都是子数组(必须是连续的),要注意一个问题就是会出现left指针大于right指针的情况,此时应该让right向后移动
left停下的位置,之前都是有序的,只要保证此时arr[left] <= arr[right]即可
要删除的中间区间为【left,right),size=right-left-1
注意不需要删除的情况和边界判断

class Solution{
    public:
    int findLengthOfShortestSubarray(vector<int> & arr){
        int n=arr.size(),right=n-1;
        while(right&&arr[right-1]<=arr[right])//从后向前遍历
        --right;
        if(right==0)return 0;//有序

        int ans=right;//删除right个
        for(int left=0;left==0||arr[left-1]<=arr[left];++left){//left之前有序
            while(right<n&&arr[right]<arr[left])//right之后有序,并且arr[left] <= arr[right],保证删除之后序列依然有序
            ++right;

            ans=min(ans,right-left-1);
        }
        return ans;
    
    }
};

// #define arr a
// class Solution {
// public:
//     int findLengthOfShortestSubarray(vector<int>& arr) {

//     if(arr.size()==1)//一个元素肯定有序
//     return 0;

//     int n=arr.size();
//     for(int i=0;i<n-1;i++)
//     {
//         if(a[i]>a[i+1])//遇到不是升序的,退出循环
//         break;
//         if(i+1==n-1)//走到最后都没有退出,序列有序,return 0;
//         return 0;
//     }
//     return 0;
//     }
// };
for(int left=0;left==0||arr[left-1]<=arr[left];++left)

这个for里的判断条件:left==0 || arr[left-1] <= arr[left]
让或操作,并让left == 0在前面这样就不会出现数组越界问题,因为left=0时,不会去判断后面的语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值