*输入整数数组 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]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。*
/**
* @param {number[]} arr
* @param {number} k
* @return {number[]}
*/
/* var getLeastNumbers = function(arr, k) {
//先给arr从小到大排序
let newarr=arr.sort(function sortnum(a,b){
return a-b;
});
return newarr.slice(0,k);
};*/
var getLeastNumbers = function(arr, k) {
let len = arr.length
if (!len || !k) return []
let start = 0
let end = len - 1
// 寻找一次标杆元素的位置
let index = quikSort(arr, start, end)
// 如果标杆元素的位置不等于 K
while(index !== k - 1) {
if (index > k-1) {
// 如果上一次查找,标杆元素位置大于目标位置
end = index-1
index = quikSort(arr, start, end)
} else {
// 如果上一次查找,标杆元素位置小于目标位置
start = index + 1
index = quikSort(arr, start, end)
}
}
return arr.slice(0, index+1)
};
function quikSort(arr, left, right) {
let pivot = arr[left]
while(left < right) {
while(left < right && arr[right] >= pivot) right--;
[arr[left],arr[right]] = [arr[right],arr[left]];
while(left < right && arr[left] < pivot) left++
[arr[left],arr[right]] = [arr[right],arr[left]];
}
arr[left] = pivot
return left
}
分析:快速排序只需要把前k个排列好就可以
关于快速排序:分别由low high两个标还有一个temp存储标准,当low的值大于high和且low对应的值temp对应的值两者交换否则low–;另一种情况high++。
存储的标准左右两边分别是比他大或小的元素,具体大小要看是从大到小排列还是从小到大排列