Skip to content

581. 最短无序连续子数组

难度: Easy

刷题内容

原题连接

内容描述

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。

示例1:

 输入: [2, 6, 4, 8, 10, 9, 15]
 输出: 5
 解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

说明 :

  1. 输入的数组长度范围在 [1, 10,000]。
  2. 输入的数组可能包含重复元素 ,所以升序的意思是<=。

解题方案

思路 1 **- 时间复杂度: O(1)*- 空间复杂度: O(N)***

省空间的算法,但是耗时间

每次循环,如果当前数组的第一位是最小值,则将其“弹出”;如果最后一位是最大值,则也将其“弹出”;如果以上两种情况都没有,则说明剩下的数组是最短无序连续子数组

代码:

/**
 * @param {number[]} nums
 * @return {number}
 */
var findUnsortedSubarray = function(nums) {
  while (nums.length) {
    if (nums[0] === Math.min(...nums)) {
      nums.shift()
    } else if (nums[nums.length - 1] === Math.max(...nums)) {
      nums.pop()
    } else {
      return nums.length
    }
  }
  return nums.length
};

思路 2 **- 时间复杂度: O(1)*- 空间复杂度: O(2N)***

省时间的算法,但是耗空间

与上面方法比较,不用每次都计算最大值和最小值

var findUnsortedSubarray = function(nums) {
  const newNums = [...nums]
  nums.sort((a, b) => (a - b))
  let startIndex = 0
  let endIndex = 0
//   正向查找
  for (let i = 0; i < newNums.length; i++) {
    if (nums[0] === newNums[i]) {
      nums.shift()
    } else {
      break
    }
  }
//  逆向查找
  for (let j = newNums.length - 1; j > 0; j--) {
    if (nums[nums.length - 1] === newNums[j]) {
      nums.pop();
    } else {
      break
    }
  }
  return nums.length;
};

我们一直在努力

apachecn/AiLearning

【布客】中文翻译组