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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章