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); } }

浙公网安备 33010602011771号