LeetCode_581. Shortest Unsorted Continuous Subarray

题目描述:
在这里插入图片描述
思路:将数组排序,然后采用双指针法从前到后比较排序后数组和元素组对应元素是否相同,不同则找到始末位置。返回长度

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        vector<int>::iterator itb=nums.begin();
        vector<int>::iterator ite=nums.end();
        vector<int> copy(itb,ite);
        sort(copy.begin(),copy.end());
        int i=0,j=nums.size()-1;
        while(i<copy.size()){
            if(copy[i]!=nums[i])
                break;
            i++;
        }
        while(j>=0){
            if(copy[j]!=nums[j])
                break;
            j--;
        }
        return i<=j?j-i+1:0;
    }
};

思路2:采用一次遍历,从前向后遍历。这段序列一定是后半部分有一段有序的子序列(个数可以为0),前半部分有一段有序的子序列(个数也可以为0),分别找到前后有序子序列的终止位置和起始位置,则中间一部分就是需要调整的部分。

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int min=INT_MIN,max=INT_MAX;
        int end=0,start=nums.size()-1;
        int n=nums.size();
        for(int i=0;i<nums.size();i++){
            if(nums[i]>=min){
                min=nums[i];
                end++;
            }else
                end=0;
            if(nums[n-1-i]<=max){
                max=nums[n-1-i];
                start++;
            }else
                start=0;
        }
        return std::max(0,n-end-start);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值