题目:
Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too.
You need to find the shortest such subarray and output its length.
Example 1:
Input: [2, 6, 4, 8, 10, 9, 15] Output: 5 Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.
Note:
- Then length of the input array is in range [1, 10,000].
- The input array may contain duplicates, so ascending order here means <=.
class Solution {
public int findUnsortedSubarray(int[] nums) {
//给定数组,返回使整个数组成为升序的最小字串
//注意:元素范围在1-10000,可能包含重复元素
//思路:先找出某段乱序,再乱序中找出最大值和最小值,然后从中间往两头搜索
//直到找到满足刚好小于乱序的最小值,和大于乱序的最大值即为满足条件
int low=0,high=nums.length-1,max=Integer.MIN_VALUE,min=Integer.MAX_VALUE;
while(low<high&&nums[low]<=nums[low+1]){
low++;
}
if(low==high){
//如果一直查找到最后一个元素,说明元数组即为有序的,返回0
return 0;
}
while(high>low&&nums[high]>=nums[high-1]){
high--;
}
//查找乱序段中最大值和最小值
for(int i=low;i<=high;i++){
max=Math.max(max,nums[i]);
min=Math.min(min,nums[i]);
}
//往两头搜索,查找满足条件的
while(low>=0&&nums[low]>min){
low--;
}
while(high<nums.length&&nums[high]<max){
high++;
}
return high-low-1;
}
}
分析(原创-易理解):
class Solution {
public int findUnsortedSubarray(int[] nums) {
//给定数组,返回使整个数组成为升序的最小字串
//注意:元素范围在1-10000,可能包含重复元素
//思路:采用与正确的数组进行匹配,匹配到tail和head不一样的长度即为结果。
int [] dummy=Arrays.copyOf(nums,nums.length);
Arrays.sort(dummy);
int head=0,tail=0;
for(int i=0;i<nums.length;i++){
if(dummy[i]!=nums[i]){
head=i;
break;
}
}
for(int i=nums.length-1;i>head;i--){
if(dummy[i]!=nums[i]){
tail=i;
break;
}
}
return tail==head?0:tail-head+1;
}
}