最小/大的k个数(Java)

该代码示例展示了如何在Java中利用优先队列(PriorityQueue)来找出整数数组中最小的k个数。通过自定义比较器,程序能够快速地维护一个大小为k的小顶堆,从而高效地获取最小元素。同时,还提供了获取数组中最大k个数的实现作为对比。
摘要由CSDN通过智能技术生成

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

package com.loo;

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;

public class LeastNumbers {

    public static void main(String[] args) {
        int[] nums = new int[] {1,3,-1,-3,5,3,6,7};
        int[] nums2 = new int[] {4,5,1,6,2,7,3,8};
        int k = 3;
        int k2 = 4;
        System.out.println(Arrays.toString(getLeastNumbers(nums2, k2))); // 最小的 k 个数
        System.out.println(Arrays.toString(getMaxNumbers(nums, k))); // 换个思路,最大的 k 个数
    }
    
    public static int[] getLeastNumbers(int[] nums , int k) {
        if (nums == null || nums.length == 0 || k <= 0) {
            return new int[0];
        }
        Queue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer p1, Integer p2) {
                return p2-p1; // diff getMaxNumbers
            }
        });
        for (int num : nums) {
            if (queue.size()<k) {
                queue.offer(num);
            } else if (queue.peek()>num) { // diff getMaxNumbers
                queue.poll();
                queue.offer(num);
            }
        }
        int[] arr = new int[queue.size()];
        int index = 0;
        for (int n : queue) {
            arr[index++] = n;
        }
        return arr;
    }
    
    public static int[] getMaxNumbers(int[] nums , int k) {
        if (nums == null || nums.length == 0 || k <= 0) {
            return new int[0];
        }
        Queue<Integer> q = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2; // diff getLeastNumbers
            }});
        for (int num : nums) {
            if (q.size()<k) {
                q.offer(num);
            } else if (q.peek()<num) { // diff getLeastNumbers
                q.poll();
                q.offer(num);
            }
        }
        int[] arr = new int[q.size()];
        int index = 0;
        for (int n : q) {
            arr[index++] = n;
        }
        return arr;
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值