剑指offer40.最小的k个数
-
题目
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
-
示例 1:
输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1]
输入:arr = [0,1,2,1], k = 1 输出:[0]
-
题解
- 题解一:自己的方法
var getLeastNumbers = function(arr,k){ var arr = arr.sort((a,b) => { return a - b; }) return arr.splice(0, k); }
- 题解二:改善排序[运行时间和内存都增加了]
var getLeastNumbers = function(arr, k) { var arr = quickSort(arr); return arr.slice(0,k); }; function quickSort(arr){ if (arr.length <= 1) { return arr; } let X = arr[0]; let left = [], right = []; for(let i=1; i<arr.length; i++){ if(arr[i] < X){ left.push(arr[i]); }else{ right.push(arr[i]); } } return (quickSort(left).concat(X,quickSort(right))) }
- 题解三:看到的一个很好的解法
function partition(arr, start, end) { const k = arr[start]; let left = start + 1, right = end; while (1) { while (left <= end && arr[left] <= k) ++left; while (right >= start + 1 && arr[right] >= k) --right; if (left >= right) { break; } [arr[left], arr[right]] = [arr[right], arr[left]]; ++left; --right; } [arr[right], arr[start]] = [arr[start], arr[right]]; return right; } var getLeastNumbers = function(arr, k) { const length = arr.length; if (k >= length) return arr; let left = 0, right = length - 1; let index = partition(arr, left, right); while (index !== k) { if (index < k) { left = index + 1; index = partition(arr, left, right); } else if (index > k) { right = index - 1; index = partition(arr, left, right); } } return arr.slice(0, k); }