首页 > 编程语言 > 详细

最短无序连续数组

时间:2020-07-09 17:30:04      阅读:53      评论:0      收藏:0      [点我收藏+]

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。

示例 1:

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

输入的数组长度范围在 [1, 10,000]。
输入的数组可能包含重复元素 ,所以升序的意思是<=。

O(n2)

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int count(0),n=nums.size(),temp,min=INT_MAX,max(-1);
        for(int i=1;i<n;i++)
        {
            if(nums[i]>nums[i-1]||nums[i]==nums[i-1])
                continue;
            temp=nums[i];
            for(int j=i;j>=0;j--)
            {
                if(j==0||temp>nums[j-1]||temp==nums[j-1])
                {
                    nums[j]=temp;
                    min=j<min?j:min;
                    max=i>max?i:max;
                    count=max-min+1;
                    break;
                }
                else
                    nums[j]=nums[j-1];
            }
        }
        return count;
    }
};

O(nlogn)

另一个简单的想法是:我们将数组 numsnums 进行排序,记为 nums\_sortednums_sorted 。然后我们比较 numsnums 和 nums\_sortednums_sorted 的元素来决定最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组。

 

O(n)

这个算法背后的思想是无序子数组中最小元素的正确位置可以决定左边界,最大元素的正确位置可以决定右边界。

因此,首先我们需要找到原数组在哪个位置开始不是升序的。我们从头开始遍历数组,一旦遇到降序的元素,我们记录最小元素为 minmin 。

类似的,我们逆序扫描数组 numsnums,当数组出现升序的时候,我们记录最大元素为 maxmax。

然后,我们再次遍历 numsnums 数组并通过与其他元素进行比较,来找到 minmin 和 maxmax 在原数组中的正确位置。我们只需要从头开始找到第一个大于 minmin 的元素,从尾开始找到第一个小于 maxmax 的元素,它们之间就是最短无序子数组。

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        int count(0),n=nums.size(),inum,jnum,min=INT_MAX,max=INT_MIN;
        for(int i=1;i<n;i++)
        {
            if(nums[i]<nums[i-1])
            {
                min=nums[i]<min?nums[i]:min;
            } 
        }
        for(int i=n-1;i>0;i--)
        {
            if(nums[i-1]>nums[i])
            {
                max=nums[i-1]>max?nums[i-1]:max;
            }  
        }
        for(int i=0;i<n;i++)
        {
            if(nums[i]>min)
            {
                inum=i;break;
            } 
        }
        for(int j=n-1;j>0;j--)
        {
            if(nums[j]<max)
            {
                jnum=j;break;
            }    
        }
        return jnum-inum+1>0?(jnum-inum+1):0;
    }
};

 

最短无序连续数组

原文:https://www.cnblogs.com/cs0915/p/13274561.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!