最短无序连续子数组
题目描述
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度
题目分析
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序
思路(一)
先排序,然后找出最左边和最右边不相同两个数下标即可
/**
@param {number[]} nums
* @return {number}
*/var findUnsortedSubarray = function(nums) {
start=0;
end=0;
var i=0;
var j=nums.length-1;
//let arr = [...nums]
let arr=nums.concat();//复制当前数组到arr中
nums.sort((a,b)=>a-b);
while(i<nums.length){
if(nums[i]!=arr[i]){
start=i;
break;
}else{
i++
}
}
while(j>=0){
if(nums[j]!=arr[j]){
end=j;
break;
}else{
j--
}
}
if(i==nums.length){
return 0;
}else{
return end - start + 1;
}
//return i==nums.length ? 0 : end - start + 1;
};
思路(二)
通过if语句中 使用nums[i]!==arr[i]判断两个数组中当前数字是否相同,如果不相同,再次判断isNaN(left)=false,当前的i值是否为第一个,我们只需要最左边的索引以及最右边的索引,分别找到符合两个if语句中要求的两个下标赋值给left和right。
注意:对left和right的初始化要保证它们的isNaN()为false;
var findUnsortedSubarray = function(nums) {
let arr=[...nums];
//初始化left和right为空或者不能转换为数字的值即目的是isNaN()初始判断为false
//let right='right'; let left='left'; 字符串不能转换为数值可以进行初始化
let right;
let left;
nums.sort((a,b)=>a-b);
for(var i=0;i<nums.length;i++){
//通过在if语句中添加isNaN(left)=false;约束此判断只能取得第一个符合要求的左边 i和右边 nums.length-1-i值,因为从第二个开始isNaN(left)=true,此时left为取得的第一个也是唯一一个符合要求的i值
if(nums[i]!==arr[i]&& isNaN(left)) left=i;
if(nums[nums.length-1-i]!==arr[nums.length-1-i]&& isNaN(right)) right=nums.length-1-i;
}
return right-left+1||0;
};
思路(三)
使用targetArr=[]用来保存不相等的坐标
var findUnsortedSubarray = function(nums) {
let arr=[...nums];
let targetArr=[];
nums.sort((a,b)=>a-b);
for(var i=0;i<nums.length;i++){
if(nums[i]!==arr[i])
targetArr.push(i);
}
if(targetArr.length===0) return 0;
return targetArr[targetArr.length-1]-targetArr[0]+1;
};