题目描述
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1:
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
首先复制一个和nums一样的数组,这里复制不能直接用等于号,因为这样复制的话地址也是一样,也就是说nums2排序那么nums也会排序,然后进行对比,直接上代码
class Solution {
public int findUnsortedSubarray(int[] nums) {
int nums2[] = Arrays.copyOf(nums, nums.length);
//对复制的nums2进行排序
Arrays.sort(nums2);
int start = 0;
int end = nums.length -1;
for (int i = 0; i < nums2.length -1; i++) {
if(nums[i] == nums2[i]){
start ++;
}else {
break;
}
}
for (int i = nums2.length -1 ; i >=0; i--) {
if(nums[i] == nums2[i]){
end --;
if(end<=start ){
return 0;
}
}else {
break;
}
}
return end - start +1;
}
}
排名靠前的代码,思路差点不其实
class Solution {
public int findUnsortedSubarray(int[] nums) {
int left = 0, cur = 0;
while (cur < nums.length - 1) {
if (nums[cur] <= nums[cur + 1]) {
cur++;
left = cur;
} else {
break;
}
}
if (cur == nums.length - 1) {
return 0;
}
while (cur < nums.length) {
while (left > -1 && nums[left] > nums[cur]) {
left--;
}
cur++;
}
int right = nums.length - 1;
cur = right;
while (cur > 1) {
if (nums[cur] >= nums[cur - 1]) {
cur--;
right = cur;
} else {
break;
}
}
if (right == 0) {
return 0;
}
while (cur > -1) {
while (right < nums.length && nums[right] < nums[cur]) {
right++;
}
cur--;
}
return right - left - 1;
}
}