leetcode 581. Shortest Unsorted Continuous Subarray

来源:互联网 发布:字符数组结束标志 编辑:程序博客网 时间:2024/05/16 05:21

第一种算法,很笨,根据序列大部分有序,中间无序的性质,把序列进行排序,然后一 一对应,就能找到从哪里开始
代码如下:

int findUnsortedSubarray(vector<int>& nums) {        vector<int> num1;        for(int i=0;i<nums.size();i++)            num1.push_back(nums[i]);        sort(num1.begin(),num1.end());        int i,j;        for(i=0;i<nums.size();i++)            if(nums[i]!=num1[i])                break;        for(j=num1.size()-1;j>=0;j--)            if(nums[j]!=num1[j])             break;        if(i==nums.size())            return 0;        return j-i+1;    }

第二种方法,先找到无序部分的最大,最小值,然后在原序列中进行比较。//一定要利用本身的性质啊,别傻傻暴力,改变思路

int findUnsortedSubarray(vector<int>& nums) {        int max=INT_MIN,min=INT_MAX;        bool flag=false;        for(int i=1;i<nums.size();i++)        {            if(nums[i]<nums[i-1])                flag=true;            if(flag==true)                min=(nums[i]<min)?nums[i]:min;       //找失序序列中最大的        }        if(!flag)        return 0;        flag=false;        for(int i=nums.size()-2;i>=0;i--)        {            if(nums[i]>nums[i+1])                flag=true;            if(flag==true)                max=(nums[i]>max)?nums[i]:max;      //找失序部分序列中最小的元素        }        int r=nums.size()-1,l=0;        for(l;l<nums.size();l++)                    //分别找下界和上界            if(nums[l]>min)                break;        for(r;r>=0;r--)            if(nums[r]<max)                break;        return r-l+1;        }
原创粉丝点击