zoukankan      html  css  js  c++  java
  • 最小的k个数

    题目描述

    此题和最大乘积有着相似的解法:https://www.cnblogs.com/cstdio1/p/11041901.html

    class Solution {
    public:
        vector<int> GetLeastNumbers_Solution(vector<int> arr, int k) {
            vector<int> mini; 
            if(arr.size()<k) return mini;
            for(int i = 0; i < k; i++){
            for(int j = i + 1; j <arr.size() ; j++) if(arr[j] < arr[i]) swap(arr[j], arr[i]);
            mini.push_back(arr[i]);
        } return mini;   
        }
    };

     题解:主要利用冒泡排序思想,因为只需要最小的k个数,所以只需要比较k趟就可以了

    class Solution {
        public int[] getLeastNumbers(int[] arr, int k) {
        int len=arr.length;
        for(int i=0;i<k;i++){
            for(int j=0;j<len-1-i;j++){
                if(arr[j]<arr[j+1]){
                    int t=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=t;
                }
            }
        }
        return Arrays.copyOfRange(arr,len-k,len);
        }
    }

    利用java自带的堆, 这里我们采用大根堆。

    // 保持堆的大小为K,然后遍历数组中的数字,遍历的时候做如下判断:
    // 1. 若目前堆的大小小于K,将当前数字放入堆中。
    // 2. 否则判断当前数字与大根堆堆顶元素的大小关系,如果当前数字比大根堆堆顶还大,这个数就直接跳过;
    //    反之如果当前数字比大根堆堆顶小,先poll掉堆顶,再将该数字放入堆中。
    class Solution {
        public int[] getLeastNumbers(int[] arr, int k) {
            if (k == 0 || arr.length == 0) {
                return new int[0];
            }
            // 默认是小根堆,实现大根堆需要重写一下比较器。
            Queue<Integer> pq = new PriorityQueue<>((v1, v2) -> v2 - v1);
            for (int num: arr) {
                if (pq.size() < k) {
                    pq.offer(num);
                } else if (num < pq.peek()) {
                    pq.poll();
                    pq.offer(num);
                }
            }
            
            // 返回堆中的元素
            int[] res = new int[pq.size()];
            int idx = 0;
            for(int num: pq) {
                res[idx++] = num;
            }
            return res;
        }
    }

    不一样的烟火
  • 相关阅读:
    mac crontab
    mac 修改MAC代码
    python 二叉树计算器
    python 验证码识别
    scp 上传和下载文件
    centos 开机执行的命令
    centos aws 修改使用密码ssh登录
    python nose测试
    C# linq to xml
    Visual Studio 2015+InstallShield 2015
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11237125.html
Copyright © 2011-2022 走看看