问题
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
例子
思路
不用动态规划。
我们将数组 nums排序,然后我们比较 nums 和 排序后的元素找到最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组。
-
方法1
-
方法2
从左往右遍历,如果该元素nums[i]<到目前为止的最大值【本来应该>左边的最大值】,则表示该数应该调整,并将high=i,则最后一个要调整的数为high
从右往左遍历,如果该匀速nums[i]>到目前为止的最小值【本来应该<右边的最小值】,则表示该数应该调整,并将low=i,则最后一个要调整的数为low当是正序时,low=-1, high=len,所以要先看high>=low?
代码
//方法1
class Solution {
public int findUnsortedSubarray(int[] nums) {
int[] arr = Arrays.copyOfRange(nums,0,nums.length);
Arrays.sort(arr);
int i=0,j=nums.length-1;
while(i<=nums.length-1) {
if(arr[i]<nums[i]) break;
i++;
}
while(j>=0) {
if(arr[j]>nums[j]) break;
j--;
}
//可能是正排序 i=len,j=-1
return j-i+1>0?j-i+1:0;
}
}
//方法2
class Solution {
public int findUnsortedSubarray(int[] nums) {
if(nums.length==1) return 0;
int max = nums[0],min=nums[nums.length-1];
int high = 0,low=nums.length-1;
for(int i=1;i<nums.length; i++) {
max = Math.max(max, nums[i-1]);
if(nums[i]<max) high=i;
}
for(int i=nums.length-2; i>=0; i--) {
min = Math.min(min, nums[i+1]);
if(nums[i]>min) low=i;
}
return high>=low?high-low+1:0;
}
}