题目
输入整数数组 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]
来源:力扣(LeetCode)leetcode-cn.com/problems/zu…
解题思路
- 这道题属于简单级别的题,核心在于对原数组排序,只要能写出排序就能答出这道题
- 这里我们用快速排序来答题,因为快速排序时间复杂度表现比较好
- 排序后把数组中下标大于k-1的元素pop掉再返回数组
代码实现
var getLeastNumbers = function (arr, k) {
//将数组排升序
const ans = quickSort(arr, 0, arr.length - 1)
//保留k个元素
while (ans.length > k) {
ans.pop()
}
return ans
};
var quickSort = function (nums, left, right) {
if (!nums || nums.length < 2) return nums
if (left < right) {
const base = partition(nums, left, right)
quickSort(nums, left, base - 1)
quickSort(nums, base + 1, right)
}
return nums
}
var partition = function (nums, left, right) {
//从待排序区找一个基准数,把小于这个数的数放左边,大于这个数的数放右边
let base = right
let minIndex = left
for (let i = left; i < right; i++) {
if (nums[i] <= nums[base]) {
//当前数小于基数时,把当前数和第一个大数交换位置
[nums[minIndex], nums[i]] = [nums[i], nums[minIndex]]
minIndex++
}
}
//基数和第一个大数交换位置
[nums[minIndex], nums[base]] = [nums[base], nums[minIndex]]
return minIndex
}
如有错误欢迎指出,欢迎一起讨论!