[路飞]_js算法:leetcode 面试题 17.14-最小K个数

109 阅读1分钟

leetcode 面试题 17.14. 最小K个数

问题描述: 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

思路: 1.采用快速排序的方法 2.基准值的获取我们采用三个值取中间值

/**
 * @param {number[]} arr
 * @param {number} k
 * @return {number[]}
 */
var smallestK = function(arr, k) {
quickSort(arr,0,arr.length-1,k);
    return arr.slice(0,k)
};
  function quickSort(arr,l,r,k){
    if(l>=r)return;
    let mid=getMid(arr[l],arr[r],arr[Math.floor((l+r)/2)]);
    let x=l,y=r;
    do{
      while(arr[x]<mid)x++;
      while(arr[y]>mid)y--;
      if(x<=y){
        [arr[x],arr[y]]=[arr[y],arr[x]];
        x++;
        y--;
      }
    }while(x<=y);
    if(y-l==k-1)return;
    if(y-l>=k) quickSort(arr,l,y,k);
    else{
      quickSort(arr,x,r,k-x+l);
    }
  }
   function getMid(a,b,c){
   if(a>b)[a,b]=[b,a];
   if(b>c)[b,c]=[c,b];
   if(a>b)[a,b]=[b,c];
   return b;
 }