剑指 Offer 40. 最小的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]

示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

限制:

0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

第一种方法:快排

class Solution {

    public int[] getLeastNumbers(int[] arr, int k) {
        if(k == 0 || k > arr.length) return new int[0];
        int l = 0, r = arr.length - 1;
        while(l < r){
            int j = quickSort(arr, l, r);
            if(j == k) break;
            if(j > k) r = j - 1;
            else l = j + 1;
        } 
        return  Arrays.copyOf(arr, k);
    }
    public int quickSort(int[] arr, int l, int r){
        int i = l, j = r + 1, x = arr[l];
        while(i < j){
            while(++i <= r && arr[i] < x);
            while(--j >= l && arr[j] > x);
            if(i < j){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }else break;
        }
        arr[l] = arr[j];
        arr[j] = x;
        return j;
    }
}

第二种方法:小根堆

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        int[] ans = new int[k];
        if(k == 0) return ans;
        PriorityQueue<Integer> q = new PriorityQueue<Integer>(new Comparator<Integer>(){
            public int compare(Integer a, Integer b){
                return a - b;  //小根堆
            }
        });
        for(int i = 0; i < arr.length; i++)
            q.offer(arr[i]);
        for(int i = 0; i < k; i++)
            ans[i] = q.poll();
        return ans;
    }
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页