T32,学一招Java大小根堆的使用

描述

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。

数据范围:0≤k,n≤100000≤k,n≤10000,数组中每个数的大小0≤val≤10000≤val≤1000

要求:空间复杂度 O(n)O(n) ,时间复杂度 O(nlogk)O(nlogk)

示例1

输入:

[4,5,1,6,2,7,3,8],4 

返回值:

[1,2,3,4]

说明:

返回最小的4个数即可,返回[1,3,2,4]也可以        

示例2

输入:

[1],0

返回值:

[]

示例3

输入:

[0,1,2,1,2],3

返回值:

[0,1,1]

方法一:Java真香,偷个懒

 

import java.util.*;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> array=new ArrayList<>(k);
        if(k>input.length){
            return array;
        }
        Arrays.sort(input);
        for(int i=0;i<k;i++){
            array.add(input[i]);
        }
        return array;
    }
}

 

 

 方法二:大根堆

import java.util.*;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> array=new ArrayList<>(k);
        PriorityQueue<Integer> queue=new PriorityQueue<>((o1, o2) -> o2 - o1);
        if(k>input.length||k==0){
            return array;
        }
        for(int i=0;i<k;i++){
            queue.add(input[i]);
        }
        for(int i=k;i<input.length;i++){
            if(queue.peek()>input[i]){
                queue.remove();
                queue.add(input[i]);
            }
        }
        for(int i=0;i<k;i++){
            array.add(queue.remove());
        }
        return array;
        
    }
}

思路:现在大根堆中放入前k个元素,遍历后续元素,如果小于堆顶元素则加入堆中,之后将堆加入数组中,返回数组。注意不能是小根堆,因为堆顶元素有可能是k个最小之中,移除后显然不对,但是同时也给了我们一个提示,如果要输出k个依次减小的数则可以用小根堆。

 附录:

PriorityQueue的使用:java中大小堆的创建_wl1929的博客-CSDN博客_(o1, o2) -> 0Java 优先队列(PriorityQueue)总结_lee的Csdn的博客-CSDN博客_java priorityqueue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值