记录 1 道算法题
部分排序
面试题 16.16. 部分排序 - 力扣(LeetCode) (leetcode-cn.com)
要求:提供一个数组,其中有一部分不是有序的,将这部分的起始下标和结束下标返回。如果数组是有序的或者是空的,返回 [-1, -1]。
比如:[1,2,4,7,10,11,7,12,6,7,16,18,19]
输出:[3,9]
采用两个指针从两头进行遍历。指针负责记录数组中的断层,也是就不是有序的那个时刻,还需要一个值保存遍历过的最大值和最小值。
当从左边开始遍历的时候,如果比最大值大,那么就更新最大值,说明此时数组是有序的。如果比最大值小则说明数组变得不是有序的。就要将右指针指向这个下标。因为遍历的时候一定会让最大值一直增大,但是一旦出现比最大值小的拐点,那么这个拐点就会是不是有序的区间的右边界。
左边界的计算同理,从右边开始遍历。
function subSort(array) {
// 初始化,默认是有序的
let l = -1
let r = -1
// 根据比大比小设置初始值
let min = Infinity
let max = -Infinity
// 从左边遍历
for(let i = 0; i < array.length; i++) {
if (array[i] > max) {
// 更新最大值
max = array[i]
} else {
// 如果不大,就不是有序的
r = i
}
}
for(let i = array.length - 1; i >= 0; i++) {
if (array[i] < min) {
// 更新最小值
min = array[i]
} else {
// 如果不小就不是有序的
l = i
}
}
return [l, r]
}