剑指offer-[最小的k个数]

159 阅读1分钟

剑指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);
    }