[路飞]leetcode-40.最小的k个数

123 阅读1分钟

输入整数数组 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]

解题: 其实就是sort后输出前k个,这样一看是不是很简单,但是,面试的时候绝对不是简单的sort就行的,这个题考的是quickSort

下面有两种实现一种是简单的sort,一种是这个题考的是quickSort

var getLeastNumbers = function(arr, k) {
    arr.sort((a,b)=>a-b)
    return arr.slice(0,k)
};
var quick_sort2 = function (arr, l, r) {
  if (l >= r) return;
  let l1 = l,
    r1 = r;
  while (l1 < r1) {
    while (l1 < r1 && arr[r1] >= arr[l]) {
      r1--;
    }
    while (l1 < r1 && arr[l1] <= arr[l]) {
      l1++;
    }
    swap(arr, r1, l1);
  }
  swap(arr, l1, l);
  quick_sort2(arr, l, r1 - 1);
  quick_sort2(arr, r1 + 1, r);
};
var swap = function (arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
};
var getLeastNumbers = function (arr, k) {
  quick_sort2(arr, 0, arr.length - 1);
  return arr.slice(0, k);
};