不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例 1:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:
0 <= len(arr) <= 1000000 <= k <= min(100000, len(arr))
思路
最容易想到的方法是排序,排完序之后取前 k 个数字。由于可以返回任意顺序的结果,快排不用全排完,只要找到第 k 个数字的位置,就可以结束排序。
/**
* @param {number[]} arr
* @param {number} k
* @return {number[]}
*/
var smallestK = function(arr, k) {
if (k === 0) {
return []
}
let sorted = false
function quicksort(lo, hi) {
if (sorted || lo >= hi) {
return
}
let i = lo
let j = hi
const num = arr[lo]
while (i < j) {
while (i < j && arr[j] >= num) {
j--
}
arr[i] = arr[j]
while (i < j && arr[i] <= num) {
i++
}
arr[j] = arr[i]
}
arr[i] = num
if (i === k) {
sorted = true
return
}
quicksort(lo, i - 1)
quicksort(i + 1, hi)
}
quicksort(0, arr.length - 1)
return arr.slice(0, k)
};