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

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

注意是vector<int>&

C++:

 class Solution {
public:
int Partition(vector<int>& input, int left , int right){
int k = left ;
for (int i = left ; i < right ; i++){
if (input[i] < input[right]){
if (k!=i)
swap(input[i],input[k]) ;
k++ ;
}
}
swap(input[right],input[k]) ;
return k ;
} vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len = input.size() ;
vector<int> output ;
if (k > len || k<=)
return output ;
int left = ;
int right = len - ;
int index = Partition(input,left,right) ;
while(index != k-){
if (index > k-){
right = index - ;
index = Partition(input,left,right) ;
}else{
left = index + ;
index = Partition(input,left,right) ;
}
}
for (int i = ; i < k ; i++)
output.push_back(input[i]) ;
return output ;
}
};

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

C++:

 class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int len = input.size() ;
if (k > len || k <= )
return vector<int>() ;
multiset<int,greater<int> > res ;
for(int num : input){
if (res.size() < k){
res.insert(num) ;
}else{
if(num < *(res.begin())){
res.erase(*(res.begin())) ;
res.insert(num) ;
}
}
}
return vector<int>(res.begin() , res.end()) ;
}
};

java:

 import java.util.ArrayList;
import java.util.PriorityQueue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
if (k > input.length || k <= 0)
return new ArrayList<Integer>() ;
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1,o2) -> o2-o1) ;
for(int num : input){
if (maxHeap.size() < k){
maxHeap.add(num) ;
}else{
if (num < maxHeap.peek()){
maxHeap.poll() ;
maxHeap.add(num) ;
}
}
}
return new ArrayList<Integer>(maxHeap) ;
}
}

30 最小的k个数的更多相关文章

  1. 剑指Offer:面试题30——最小的k个数(java实现)

    问题描述: 输入n个整数,找出其中最小的k个数 思路1: 先排序,再取前k个 时间复杂度O(nlogn) 下面给出快排序的代码(基于下面Partition函数的方法) public void Quic ...

  2. 面试题30.最小的k个数

    题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方 ...

  3. 30:最小的K个数

    import java.util.ArrayList; import java.util.TreeSet; /** * 面试题30:最小的K个数 * 输入n个整数,找出其中最小的K个数.例如输入4,5 ...

  4. 剑指offer面试题30:最小的k个数

    一.题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 二.解题思路 1.思路1 首先对数组进行排序,然后取出前k个数 ...

  5. (剑指Offer)面试题30:最小的k个数

    题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 1.排序 把输入的n个整数排序,然后取前k个数: 时间复杂度 ...

  6. 【剑指offer】面试题30:最小的 k 个数

    题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 这个是O(nlogk)时间复杂度的思路:用一个容器来保存最先 ...

  7. 【面试题030】最小的k个数

    [面试题030]最小的k个数 题目:     输入n个整数,找出其中最小的k个数.     例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4.     思路一:   ...

  8. 剑指Offer面试题:27.最小的k个数

    一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...

  9. 算法练习:寻找最小的k个数

    参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中 ...

随机推荐

  1. Hadoop部署方式-完全分布式(Fully-Distributed Mode)

    Hadoop部署方式-完全分布式(Fully-Distributed Mode) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本博客搭建的虚拟机是伪分布式环境(https://w ...

  2. Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream)

    Java基础-IO流对象之字节缓冲流(BufferedOutputStream与BufferedInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在我们学习字 ...

  3. 内存操作函数memmove,memcpy,memset

    通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作 ...

  4. 把数组存入到cookie中

    $arr = array(1,2,3); // 把数组序列化之后,存入到cookie中 $arr_str = serialize($arr); // 序列化数组 setcookie('a',$arr_ ...

  5. 部署elasticsearch遇到的问题

    为增加搜索功能,最近在自己的服务器上部署elasticsearch,折腾一下,把注意的问题记录一下. 1.  因为最近的es5.5.2要求java1.8,所以确保java版本正确. 2. 我的服务器只 ...

  6. Intellij IDEA 2017 控制台打印换行

    Intellij IDEA 2017 控制台打印的内容超过屏幕宽度了,请问怎么自动换行? 记得重启idea

  7. phpcm nginx 伪静态文件

    rewrite ^/show-([0-9]+)-([0-9]+)-([0-9]+).html /index.php?m=content&c=index&a=show&catid ...

  8. HDU 1422 重温世界杯 DP题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1422 解题报告:DP题,要使旅行的城市最多,关键是要选出一个城市作为开始,以这个城市作为开始的城市时, ...

  9. 【leetcode 简单】 第七十四题 缺失数字

    给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数. 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [9,6,4,2 ...

  10. 【leetcode 简单】 第七十题 有效的字母异位词

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram" ...