牛客网-最小的k个数

简介: 牛客网-最小的k个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

解题思路

package 练习;
import java.util.ArrayList;
import java.util.Collections;
import java.util.PriorityQueue;
public class Solution {
    static public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<>();
        if(input==null || k>input.length || k==0)
            return list;
        //存放k个值,按从大到小排列
        PriorityQueue<Integer> queue = new PriorityQueue<>(k, Collections.reverseOrder());
        for (int i = 0; i < input.length; i++) {
            //前k个直接存
            if(i<k){
                //PriorityQueue会自动排序
                queue.offer(input[i]);
                //存入list
                list.add(input[i]);
            //前k个之后的进行比较(与最大堆了堆顶元素比较)
            }else{
                //如果第i个元素 < 最大堆的顶元素 就把最大堆的顶元素取出,然后重新把这个小的值存入
                if(queue.peek() > input[i]) {
                    //删除list中这个最大的元素
                    list.remove(queue.peek());
                    //把较上一个小的存入
                    list.add(input[i]);
                    //最大堆也更新
                    queue.poll();
                    queue.offer(input[i]);
                }
            }
        }
//这样也行
//        for (int i=0;i<k;i++){
//            list.add(queue.poll());
//        }
        //返回List
        return list;
    }
    public static void main(String[] args) {
        int[] nums={4,5,1,6,2,7,3,8};
        ArrayList exchange = GetLeastNumbers_Solution(nums,4);
        for (Object o : exchange) {
            System.out.println(o);
        }
    }
}
目录
相关文章
|
8月前
|
算法 测试技术
LeetCode-1004. 最大连续1的个数 III
LeetCode-1004. 最大连续1的个数 III
|
8月前
leetcode-485:最大连续1的个数
leetcode-485:最大连续1的个数
52 0
【剑指offer】-最小K个数-28/67
【剑指offer】-最小K个数-28/67
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
【力扣每日一题:2-19】1004. 最大连续1的个数 III【中等】
|
机器学习/深度学习 Cloud Native
【刷题日记】2044. 统计按位或能得到最大值的子集数目
本次刷题日记的第 8 篇,力扣题为:2044. 统计按位或能得到最大值的子集数目 ,中等
Leetcode——485. 最大连续 1 的个数
文章目录 1、题目 2、滑动窗口 3、一次遍历(官方题解)
Leetcode——485. 最大连续 1 的个数
|
算法 C++ 容器
剑指Offer - 面试题40:最小的k个数
剑指Offer - 面试题40:最小的k个数
69 0
剑指offer 41. 最小的k个数
剑指offer 41. 最小的k个数
79 0
LeetCode 485. 最大连续 1 的个数 - 暴力法
定义两个变量 thisSum 每次遍历中的最大值 maxSum 返回值,所有遍历结果中的最大值
|
算法
LeetCode 面试题 17.14. 最小K个数
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
87 0