LeetCode(top100)最短无序连续子数组

最短无序连续子数组

题目描述

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度

题目分析

输入: [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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值