LC——最短无序连续子数组
题目链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/
要求:
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
(这是目前提交次数最多,错的最多的题目,快十次了,可能一开始的想法就是错误的,导致解决了一个问题又出现另外的问题。一开始想的是从前往后遍历,出现乱序的记录一下起始下标,再从后往前遍历,记录结束的下标,结束的下标减开始的下标就是乱序的长度。结果出现了各种问题,只能换种思路了。)
代码:
public static int findUnsortedSubarray(int[] nums) {
int[] bnums = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
bnums[i] = nums[i];
}
Arrays.sort(nums);
int startIndex = 0;
for (int i = 0; i < nums.length; i++) {
if(bnums[i] != nums[i]){
startIndex = i;
break;
}
}
int endIndex = 0;
for (int i = nums.length-1; i >= 0; i--) {
if(bnums[i] != nums[i]){
endIndex = i;
break;
}
}
return endIndex-startIndex>0?endIndex-startIndex+1:endIndex-startIndex;
}
思路:
1.首先新建一个一模一样的数组
2.对原来的数组排序
3.从头遍历,对比新建的数组,如果出现相同下标位置的数不一样,记录一下,同理从后往前遍历一次
4.两个下标的差值,如果大于0,则加1为长度,负责就是差值(0)。