部分排序
给定一个整数数组,编写一个函数,找出索引m和n,只要将索引区间[m,n]的元素排好序,整个数组就是有序的。注意:n-m尽量最小,也就是说,找出符合条件的最短序列。函数返回值为[m,n],若不存在这样的m和n(例如整个数组是有序的),请返回[-1,-1]。
先排序 再与原数组前后依次对比
const subSort = (array = [1, 2, 4, 7, 10, 11, 7, 12, 6, 7, 16, 18, 19]) => {
const len = array.length
const copy = [...array]
copy.sort((x, y) => x - y)
let start = 0
let end = len - 1
while (array[start] === copy[start] && start < len) {
start++
}
while (array[end] === copy[end] && end > -1) {
end--
}
if (start === len || end === -1) {
return [-1, -1]
}
return [start, end]
};
前后各找到不是按照升序、降序的排序的数组段 找出最大、小值 然后在原数组中找到其真正的下标位置
const subSort = (array = [5, 3, 1, 7, 9]) => {
const len = array.length
let start = -1,
end = -1
for (let i = 0; i < len - 1; i++) {
const cv = array[i],
nv = array[i + 1]
if (cv > nv) {
start = i
break
}
}
if (start === -1) return [-1, -1]
for (let i = len - 1; i > 0; i--) {
const cv = array[i],
nv = array[i - 1]
if (cv < nv) {
end = i
break
}
}
if (end === -1) return [-1, -1]
const sliceArray = array.slice(start, end + 1)
const min = Math.min(...sliceArray)
const max = Math.max(...sliceArray)
const res = []
for (let i = 0; i < len - 1; i++) {
if (array[i] > min) {
res.push(i)
break
}
}
for (let i = len - 1; i > -1; i--) {
if (array[i] < max) {
res.push(i)
break
}
}
return res
};
以自己现在的努力程度,还没有资格和别人拼天赋

浙公网安备 33010602011771号