面试题 16.16. 部分排序

220 阅读1分钟

题目描述

leetcode-cn.com/problems/su…

分析

要求找需要排序的区间

算法

双指针

过程

左指针:左边元素需要排序是因为比右边元素大,因此左指针会根据右边元素的最小值寻找

右指针:右边元素需要排序是因为比左边元素小,因此右指针会根据左边元素的最大值寻找

代码

/**
 * @param {number[]} array
 * @return {number[]}
 */
var subSort = function (array) {
  let r = -1,
    l = -1
  //正向遍历记录最右区间值
  let max = Number.MIN_SAFE_INTEGER
  for (let i = 0; i < array.length; i++) {
    if (array[i] >= max) {
      max = array[i]
    } else {
      r = i
    }
  }
  //反向遍历记录最左区间值
  let min = Number.MAX_SAFE_INTEGER
  for (let i = array.length - 1; i >= 0; i--) {
    if (array[i] <= min) {
      min = array[i]
    } else {
      l = i
    }
  }
  return [l, r]
}