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

    输入n个整数,找出其最小的k个数,例如输入4,5,1,6,2,7,3,8,最小的4个数为1,2,3,4

    解法一:快排思想,会改变原数组    O(n)

    注意是vector<int>&

    C++:

     1 class Solution {
     2 public:
     3     int Partition(vector<int>& input, int left , int right){
     4         int k = left ;
     5         for (int i = left ; i < right ; i++){
     6             if (input[i] < input[right]){
     7                 if (k!=i)
     8                     swap(input[i],input[k]) ;
     9                 k++ ;
    10             }
    11         }
    12         swap(input[right],input[k]) ;
    13         return k ;
    14     }
    15     
    16     vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
    17         int len = input.size() ;
    18         vector<int> output ;
    19         if (k > len || k<=0)
    20             return output ;
    21         int left = 0 ;
    22         int right = len - 1 ;
    23         int index = Partition(input,left,right) ;
    24         while(index != k-1){
    25             if (index > k-1){
    26                 right = index - 1 ;
    27                 index = Partition(input,left,right) ;
    28             }else{
    29                 left = index + 1 ;
    30                 index = Partition(input,left,right) ;
    31             }
    32         }
    33         for (int i = 0 ; i < k ; i++)
    34             output.push_back(input[i]) ;
    35         return output ;
    36     }
    37 };

    解法二:维护一个大小为k的容器,每次将容器中最大的数字用小数字替换掉
    O(nlogk)
    如果有海量数据,没法一次放入内存中,可用这种方法
    可用大顶堆或者红黑树

    C++:

     1 class Solution {
     2 public:
     3     vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
     4         int len = input.size() ;
     5         if (k > len || k <= 0)
     6             return vector<int>() ;
     7         multiset<int,greater<int> > res ;
     8         for(int num : input){
     9             if (res.size() < k){
    10                 res.insert(num) ;
    11             }else{
    12                 if(num < *(res.begin())){
    13                     res.erase(*(res.begin())) ;
    14                     res.insert(num) ;
    15                 }
    16             }
    17         }
    18         return vector<int>(res.begin() , res.end()) ;
    19     }
    20 };

    java:

     1 import java.util.ArrayList;
     2 import java.util.PriorityQueue;
     3 public class Solution {
     4    public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
     5        if (k > input.length || k <= 0)
     6            return new ArrayList<Integer>() ;
     7        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2) -> o2-o1) ;
     8        for(int num : input){
     9            if (maxHeap.size() < k){
    10                maxHeap.add(num) ;
    11            }else{
    12                if (num < maxHeap.peek()){
    13                    maxHeap.poll() ;
    14                    maxHeap.add(num) ;
    15                }
    16            }
    17        }
    18        return new ArrayList<Integer>(maxHeap) ;
    19    }
    20 }
  • 相关阅读:
    Ubuntu 下Apache安装和配置
    MariaDB二进制包简单安装部署
    Ubuntu下MongoDB的安装和使用
    Linux文件类型及目录配置
    centos7下挂载U盘和移动硬盘
    详解 比特(位,bit),字节(Byte),字符的区别 *(转)
    Socket使用及简单实例
    缓存
    字体小图标记录
    大流量下的兜底容灾方案
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/8998328.html
Copyright © 2011-2022 走看看