题目大意:将给定的数组从小到大排序,找出最短的需要进行位置变换的子数组的长度
1、找到子数组起始的位置和结束位置
2、最小长度=结束位置-起始位置+1
public static int findUnsortedSubarray(int[] nums) {
//如果数组不存在或为空 寻找最短的与要重新排序的子列没有意义 直接返回0
if(nums==null||nums.length==0) {
return 0;
}
/*设置起始位置和结束位置的的初始值 discuss里面选的是start=-1 end=-2
* 个人觉得这个可以随意取 至于要保证end-start+1=0 即end-start=-1就可以了
* 不过为了不与数组的下标混在一起 最好选负数
* 注意一点 如果end变了 start绝对也会变的
*/
int start=-3;
int end=-2;
/*设置数组中的最大值 因为最后要求数组从小到大排列 所以从左往右依次比较寻找最大值
确定end 默认第一个值为最大值
*/
int max=nums[0];
//同理从右往左依次比较 寻找最小值 确定start 默认最后一个为最小值
int min=nums[nums.length-1];
for(int i=1;i<nums.length;i++) {
/*从左往右 当然是希望一个比一个大 这样end就不需要改变 ,start也不会变
需要重新排列的子列长度就是-1+1=0
*/
max=Math.max(nums[i],max);
/*如果nums[i]小于最大值 其实也就是小于前一个值了 例如1 3 4 5 2...
这时候的end就必须变成4了
数组下标为4的位置上的“2”肯定是要移动位置重新排的
*/
if(nums[i]<max) {
end=i;
}
}
//从数组的右边开始 寻找start
for(int i=nums.length-2;i>=0;i--) {
/* 1 2 3 4... 从右往左 如果都比右边的最小数小(其实就是左边的数依次比右边的小)
start就不需要改变
*/
min=Math.min(nums[i], min);
//如果 1 2 3 5 4...很明显5比4大 start就是下标3
if(nums[i]>min) {
start=i;
}
}
return end-start+1;
}