p120 需要排序的最短子数组(leetcode 581)

一:解题思路

解题的关键之处在于:对于一个已经递增排序好的数组,从左往右本来就是递增的,从右往左本来就是递减的。我们只需要找到第一次不满足这2个条件的下标 i和j,然后基于这两个下标 i和j,分别向两边扩展,确定最短长度。

记住这个例子:02418

方法一:Time:O(n*log(n)),Space:O(n)

方法二:Time:O(n),Space:O(1)

二:完整代码示例 (C++版和Java版)

 

方法一:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
          if(nums.size()==0) return -1;
          vector<int> clone=nums;
sort(clone.begin(),clone.end());
int i=0; int j=clone.size()-1; while(i<clone.size() && nums[i]==clone[i]) i++; while(j>=0 && nums[j]==clone[j]) j--; return max(j-i+1,0); } };

 

 

C++:

class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) 
    {
        if (nums.size() == 0) return 0;
        int n = nums.size();
        int i = 0, j = nums.size() - 1;
        int maxValue =-2147483648;
        int minValue = 2147483647;
        while (i < n - 1 && nums[i + 1] >= nums[i]) i++;
        while (j > 0 && nums[j] >= nums[j - 1]) j--;

        for (int k = i; k <= j; k++)
        {
            maxValue = max(maxValue,nums[k]);
            minValue = min(minValue,nums[k]);
        }

        while (i >= 0 && nums[i] > minValue) i--;
        while (j < n && nums[j] < maxValue) j++;

        return max(j-i-1,0);
    }
};

Java:

class Solution {
        public int findUnsortedSubarray(int[] nums)
        {
               if(nums==null || nums.length==0) return 0;
               int i=0,j=nums.length-1;
               int n=nums.length;

               while(i< n-1 && nums[i+1]>=nums[i]) i++;
               while(j>0 && nums[j]>=nums[j-1]) j--;
               int min=Integer.MAX_VALUE;
               int max=Integer.MIN_VALUE;

               for(int k=i;k<=j;k++)
               {
                   min=Math.min(min,nums[k]);
                   max=Math.max(max,nums[k]);
               }

               while(i>=0 && nums[i]>min) i--;
               while (j<n && nums[j]<max) j++;

               return Math.max(j-i-1,0);
        }
    }

 

posted @ 2020-04-13 17:53  repinkply  阅读(124)  评论(0)    收藏  举报