/* * @Description: 剑指 Offer 40. 最小的k个数 * @Author: libk * @Github: https://github.com/libk */ /** * @param {number[]}arr * @param {number}k * @return {number[]} */ const getLeastNumbers = function (arr, k) { let left = 0 let right = arr.length - 1 let res = []
const partition = (arr, left, right) => { let random = Math.floor(Math.random() * (right - left + 1)) + left let povit = arr[random]
;[arr[random], arr[left]] = [arr[left], arr[random]] while (left < right) { while (left < right && arr[right] >= povit) { right-- } if (left < right) { arr[left++] = arr[right] } while (left < right && arr[left] < povit) { left++ } if (left < right) { arr[right--] = arr[left] } } arr[left] = povit return left }
while (true) { let index = partition(arr, left, right) if (index === k) { return arr.slice(0, k) } elseif (index > k) { right = index - 1 } else { left = index + 1 } } }