【1】TOPK最小的K个数(多种方法比较)
(头条)
最小的第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个数,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。
- 链接:https://www.nowcoder.com/questionTerminal/6a296eb82cf844ca8539b57c23e6e9bf
- 来源:牛客网
- import java.util.ArrayList;
- import java.util.PriorityQueue;
- import java.util.Comparator;
- public class Solution {
- public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
- ArrayList<Integer> result = new ArrayList<Integer>();
- int length = input.length;
- if(k > length || k == 0){
- return result;
- }
- PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
- @Override
- public int compare(Integer o1, Integer o2) {
- return o2.compareTo(o1);
- }
- });
- for (int i = 0; i < length; i++) {
- if (maxHeap.size() != k) { //堆(优先队列加满后才出队)
- maxHeap.offer(input[i]);
- } else if (maxHeap.peek() > input[i]) {
- Integer temp = maxHeap.poll();
- temp = null;
- maxHeap.offer(input[i]);
- }
- }
- for (Integer integer : maxHeap) {
- result.add(integer);
- }
- return result;
- }
- }
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)。
- import java.util.*;
- public class Solution {
- public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
- ArrayList<Integer> list = new ArrayList();
- if(input.length==0||input.length<k||k<=0){
- return list;
- }
- int index = partition(input,0,input.length-1,k);
- int low = 0;
- int high = input.length-1;
- while(index!=k-1){
- if(index>k-1){
- high = index-1;
- index = partition(input,low,high,k);
- }
- else if(index<k-1){
- low = index+1;
- index = partition(input,low,high,k);
- }
- }
- for(int i=0;i<k;i++){
- list.add(input[i]);
- }
- return list;
- }
- public int partition(int[] array,int low,int high,int k){
- int temp = array[low];
- while(low!=high){
- while(low<high&&array[high]>=temp)
- high--;
- array[low] = array[high];
- while(low<high&&array[low]<=temp)
- low++;
- array[high] = array[low];
- }
- array[low] = temp;
- return low;
- }
- }
【1】TOPK最小的K个数(多种方法比较)的更多相关文章
- 编程之法section II: 2.1 求最小的k个数
====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zz ...
- 03寻找最小的k个数
题目描述:查找最小的k个元素 题目:输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单 ...
- 寻找最小的k个数(四种方法)
1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) ...
- Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么 ...
- 剑指Offer面试题:27.最小的k个数
一.题目:最小的k个数 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 这道题是典型的TopK问题,其最简单的思路莫过于 ...
- 面试题30.最小的k个数
题目:输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8 这8个数字,则最小的四个数字为1,2,3,4, 这道题是典型的TopK问题,剑指Offer提供了两种方法来实现,一种方 ...
- 剑值offer:最小的k个数
这是在面试常遇到的topk问题. 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路: 思路一:用快排对数 ...
- 面试题40:最小的 k 个数
import java.util.Arrays; /** * Created by clearbug on 2018/2/26. * * 面试题40:最小的 k 个数 * * 注意:因为前两天在陌陌面 ...
- 每日一题 - 剑指 Offer 40. 最小的k个数
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3. ...
随机推荐
- linux实现pwd
版本1: 调用系统接口getcwd,实现路径打印. /*** ***文件名:1_mypwd.c ***描述:通过系统函数getcwd实现pwd命令 ***/ #include<stdio.h&g ...
- MyBatis框架,增删改查
一.recourses中核心配置文件mybatis-config.xml 二. recourse中jdbc.properties 三.entity实体类 四.Dao层 五.ISmbmsUserDao. ...
- mac下 Eclipse代码自动补齐 设置
Eclipse -> Perferences -> Java -> Editor -> Content Assist如下图. 将auto activation triggers ...
- Morpheus
https://software.broadinstitute.org/morpheus/
- lamda表达式求最小值
//取最小设置金额的列 var minList = LsList.OrderBy(n=>n.Price).First(); //取最小设置金额的值 var minValue = LsList.S ...
- java多线程(五)线程通讯
1.1. 为什么要线程通信 多个线程并发执行时,在默认情况下CPU是随机切换线程的,有时我们希望CPU按我们的规律执行线程,此时就需要线程之间协调通信. 1.2. 线程通讯方式 线程间通信常用方式如下 ...
- ubuntu16.04下安装运行PL-SLAM
PL-SLAM是Ruben Gomez-Ojeda大神融合点和线特征SLAM的最新成果,并开放了源代码,本博文记录安装运行PL-SLAM遇到的一些问题. 1源代码地址 https://github.c ...
- rocketmqy压测消费端解决源码中不能正常消费的问题
因为近期在做rocketmq的性能压测,然后看到一些文章,提到用rocketmq中的自带的benchamark工具进行压测,因为我们公司是自己在做了一个二次封装,做了一层认证,所以工具还需要在改造,所 ...
- vc对话框程序运行时隐藏
1.在资源编辑中设置对话框为不可见 2.在OnPaint中加入下面代码 void CMyDlg::OnPaint() { static b = false; if(!b){ ShowWindow(SW ...
- phpspreadsheet 中文文档(八)读写文件+读取文件
2019年10月11日14:09:40 配置设定 将PhpSpreadsheet文件包含在脚本中之后,但是在实例化Spreadsheet对象或加载工作簿文件之前,可以设置许多配置选项,这些配置选项将影 ...