(头条)

最小的第K个数也是和这题topK一样的思路

1、全排序  时间复杂度O(nlogn)

2、Partiton思想 时间复杂度O(n)  (因为不需要像快排一样对所有的分段都两两Partition)

基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。调整之后,位于数组左边的k个数字就是最小的k个数字(这k个数字不一定是排序的)。O(N)

3、最大堆 时间复杂度O(nlogk)

Java堆用优先队列PriorityQueue实现

4、如果用冒泡排序,时间复杂度为O(n*k)

1、全排序  时间复杂度O(nlogn)

Arrays.sort()

3、最大堆 时间复杂度O(nlogk)

用最大堆保存这k个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。

  1. 链接:https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf
  2. 来源:牛客网
  3.  
  4. import java.util.ArrayList;
  5. import java.util.PriorityQueue;
  6. import java.util.Comparator;
  7. public class Solution {
  8. public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
  9. ArrayList<Integer> result = new ArrayList<Integer>();
  10. int length = input.length;
  11. if(k > length || k == 0){
  12. return result;
  13. }
  14. PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
  15.  
  16. @Override
  17. public int compare(Integer o1, Integer o2) {
  18. return o2.compareTo(o1);
  19. }
  20. });
  21. for (int i = 0; i < length; i++) {
  22. if (maxHeap.size() != k) { //堆(优先队列加满后才出队)
  23. maxHeap.offer(input[i]);
  24. } else if (maxHeap.peek() > input[i]) {
  25. Integer temp = maxHeap.poll();
  26. temp = null;
  27. maxHeap.offer(input[i]);
  28. }
  29. }
  30. for (Integer integer : maxHeap) {
  31. result.add(integer);
  32. }
  33. return result;
  34. }
  35. }

2、Partiton思想 时间复杂度O(n)  

链接:https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf
利用快速排序中的获取分割(中轴)点位置函数Partitiion。
基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字大的所有数字都位于数组的右边。调整之后,位于数组左边的k个数字就是最小的k个数字(这k个数字不一定是排序的)
时间复杂度O(n) :一遍partition是O(N)的很容易证明。求第k大数的时候,pivot的不满足条件的那一侧数据不需要再去处理了,平均时间复杂度为O(N+N/2+N/4+...)=O(N)。而快排则需要处理,复杂度为O(nlogn)。

  1. import java.util.*;
  2. public class Solution {
  3. public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
  4. ArrayList<Integer> list = new ArrayList();
  5. if(input.length==0||input.length<k||k<=0){
  6. return list;
  7. }
  8. int index = partition(input,0,input.length-1,k);
  9. int low = 0;
  10. int high = input.length-1;
  11.  
  12. while(index!=k-1){
  13. if(index>k-1){
  14. high = index-1;
  15. index = partition(input,low,high,k);
  16. }
  17. else if(index<k-1){
  18. low = index+1;
  19. index = partition(input,low,high,k);
  20. }
  21. }
  22.  
  23. for(int i=0;i<k;i++){
  24. list.add(input[i]);
  25. }
  26. return list;
  27. }
  28. public int partition(int[] array,int low,int high,int k){
  29. int temp = array[low];
  30. while(low!=high){
  31. while(low<high&&array[high]>=temp)
  32. high--;
  33. array[low] = array[high];
  34. while(low<high&&array[low]<=temp)
  35. low++;
  36. array[high] = array[low];
  37. }
  38. array[low] = temp;
  39. return low;
  40. }
  41. }

【1】TOPK最小的K个数(多种方法比较)的更多相关文章

  1. 编程之法section II: 2.1 求最小的k个数

    ====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zz ...

  2. 03寻找最小的k个数

    题目描述:查找最小的k个元素         题目:输入n个整数,输出其中最小的k个.         例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...

  3. 寻找最小的k个数(四种方法)

    1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) ...

  4. Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法

    最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...

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

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

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

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

  7. 剑值offer:最小的k个数

    这是在面试常遇到的topk问题. 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路: 思路一:用快排对数 ...

  8. 面试题40:最小的 k 个数

    import java.util.Arrays; /** * Created by clearbug on 2018/2/26. * * 面试题40:最小的 k 个数 * * 注意:因为前两天在陌陌面 ...

  9. 每日一题 - 剑指 Offer 40. 最小的k个数

    题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...

随机推荐

  1. linux实现pwd

    版本1: 调用系统接口getcwd,实现路径打印. /*** ***文件名:1_mypwd.c ***描述:通过系统函数getcwd实现pwd命令 ***/ #include<stdio.h&g ...

  2. MyBatis框架,增删改查

    一.recourses中核心配置文件mybatis-config.xml 二. recourse中jdbc.properties 三.entity实体类 四.Dao层 五.ISmbmsUserDao. ...

  3. mac下 Eclipse代码自动补齐 设置

    Eclipse -> Perferences -> Java -> Editor -> Content Assist如下图. 将auto activation triggers ...

  4. Morpheus

    https://software.broadinstitute.org/morpheus/

  5. lamda表达式求最小值

    //取最小设置金额的列 var minList = LsList.OrderBy(n=>n.Price).First(); //取最小设置金额的值 var minValue = LsList.S ...

  6. java多线程(五)线程通讯

    1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...

  7. ubuntu16.04下安装运行PL-SLAM

    PL-SLAM是Ruben Gomez-Ojeda大神融合点和线特征SLAM的最新成果,并开放了源代码,本博文记录安装运行PL-SLAM遇到的一些问题. 1源代码地址 https://github.c ...

  8. rocketmqy压测消费端解决源码中不能正常消费的问题

    因为近期在做rocketmq的性能压测,然后看到一些文章,提到用rocketmq中的自带的benchamark工具进行压测,因为我们公司是自己在做了一个二次封装,做了一层认证,所以工具还需要在改造,所 ...

  9. vc对话框程序运行时隐藏

    1.在资源编辑中设置对话框为不可见 2.在OnPaint中加入下面代码 void CMyDlg::OnPaint() { static b = false; if(!b){ ShowWindow(SW ...

  10. phpspreadsheet 中文文档(八)读写文件+读取文件

    2019年10月11日14:09:40 配置设定 将PhpSpreadsheet文件包含在脚本中之后,但是在实例化Spreadsheet对象或加载工作簿文件之前,可以设置许多配置选项,这些配置选项将影 ...