leetcode581最短无序连续子数组c++

题目描述

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。

示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

思路分析&代码实现

思路:
首先,找到前半截和后半截排好序的最长数组,因为除去这部分的中间部分数组长度一定是要求的长度的下界。
考虑,前后半截排好序也不一定就可以,还需要满足的条件:1.前半截排好序的数比中间部分的最小的数要小;2.后半截排好序的数一定要比中间部分最大的数都大。
因此,接下来,我们求中间的最小数和最大数。
最后,从最靠近中间部分的数开始比较,若是前半部分的比最小数大,则中间部分需要加1,继续向前遍历。后半部分也是一样的。

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int l = 0, r = nums.size()-1;
        if( !r ) return 0;
        while(l < r && nums[l] <= nums[r]){
            if(nums[l] > nums[l+1] && nums[r] < nums[r-1])
                break;
            if(nums[l] <= nums[l+1]) l++;
            if(nums[r] >= nums[r-1]) r--;
        }
        if(l >= r) return 0;
        int l1 = l;
        int min = nums[l], max = nums[l];
        while(l1 <= r)
        {
            if(nums[l1] < min) min = nums[l1];
            if(nums[l1] > max) max = nums[l1];
            l1++;
        }
        while( l > 0 && nums[l-1] > min) l--;
        while( r < nums.size()-1 && nums[r+1] < max) r++;
        return r-l+1;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值