原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情况下可以模拟其他数据结构,Queue库提供了栈和队列,甚至优先队列(和最小堆类似),heapq提供了最小堆,树,链表的指针在python中可以当作最普通的变量,所以python大法好...使用python确实可以把程序员从复杂的数据结构中解放开来,重点关注算法.好了言归正传. 题目 前几天看到了一个…
题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护一个有k个数的大根堆,这个堆代表目前选出的k个最小的数.在堆的k个元素中堆顶元素是最小的k个数中最大的那个. 接下来要遍历整个数组,遍历的过程中看当前数是否比堆顶元素小.如果是,就把堆顶元素替换成当前数,然后调整堆.如果不是,则不做任何操作,继续遍历下一个数.在遍历完成后,堆中的k个数就是所有数组中…
/** * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) * 过程: * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 * 在堆里的k个元素中堆顶的元素是最小的k个数中最大的那个. * 2.接下来,遍历整个数组,遍历过程中看当前数是否比堆顶元素小: * 如果是,就把堆顶元素替换成当前的数,然后从堆顶的位置调整整个堆,让替 * 换操作后堆的最大元素继续处在堆顶的位置: * 如果不是,则不进行任何操作,继续遍历下一个数: * 3.在遍历完成后,堆中的k个数就是所有数…
方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如果大于最大元素则忽略,如果小于最大元素则将次元素送入堆中,并将堆的最大元素删除,调整堆的结构; 方法3:使用快速排序的原理,选择出数组中第K大的元素,select(a[], k, low, high) 选取数组中a[high]为基准,将数组分割为A1和A2,A1中的元素都比a[high]小,A[2]中的元素都…
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来源:牛客网 无序数组中最小的k个数 对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致. 给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数. 测试样例: [1,2,4,3],4,2 返回:[1,2] 代码 需要保留K个较小的元素,可以删…
题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Author: lizhouwei * @CreateDate: 2018/4/29 7:37 * @Modify by: * @ModifyDate: */ public class Chapter8_4 { //使用堆排序 时间复杂度为O(logN) public int[] getKMin(int[]…
public class MinHeap { /* * * Top K个问题,求给定数据中最小的K个数 * * 最小堆解决:堆顶元素为堆中最大元素 * * * */ private int MAX_DATA = 10;//最小10个数 private int[] data;//存储数据 private int len;//当前存储长度,考虑到元素个数可能没有10个,这个时候全部输出 private MinHeap() { data = new int[MAX_DATA]; len=0; } pr…
最近看到了 java.util.PriorityQueue.刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数. 假设有如下 10 个整数. 5 2 0 1 4 8 6 9 7 3 怎么找出最小的 5 个数呢?很好想到的方法是先升序排序,然后取前 5 个就可以. 至于怎么排序方法有很多,比如简单的冒泡,选择,"难点"的有快速,希尔和堆等等. 先看看这种比较少见的实现方法的代码,再看看下面的简单介绍. PriorityQueue实现 import java.util.Arr…
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.ArrayList; import java.util.Comparator; import java.util.PriorityQueue; import org.junit.Test; public class GetLeastNumbers_Solution { /** * 基于优先队列,时间复杂度为…
原创博文,转载请注明出处! http://github.com/wanglei5205 http://cnblogs.com/wanglei5205 # 题目 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4 # 思路 基于Partition的思路 时间复杂度为O(n) 基于红黑树的思路 辅助容器:定义用于遍历向量的辅助容器--迭代器ite:定义用于存储结果的辅助容器--多重集合res. 基本思路:首先创建一个大小为k的容器,…
/*输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字, 则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0] https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/*/ //最小的k个数 public static int[] g…
出题:输入N个整数,要求输出其中最小的K个数: 分析: 快速排序和最小堆都可以解决最小(大)K个数的问题(时间复杂度为O(NlogN)):另外可以建立大小为K的最大堆,将前K个数不断插入最大堆,对于之后的N-K个数,依次与堆顶元素进行比较,如果新元素更小则删除当前堆顶元素,并更新最大堆:如果新元素大则跳过: 第一种实现:快速排序框架,插入排序处理小子文件,随机函数选取split点,双向扫描: 第二种实现:最小堆框架,基于fixUp的堆构建策略(数组整体更新,bottom up),通过删除前K个堆…
题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. *知识点:Java PriorityQueue 调整新插入元素 转自https://www.cnblogs.com/CarpenterLee/p/5488070.html //siftUp() private void siftUp(int k, E x) { while (k > 0) { int parent = (k - 1) >>> 1;//pa…
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,.   # -*- coding:utf-8 -*- class Solution: def GetLeastNumbers_Solution(self, tinput, k): # write code here #如果输入的n不存在则输出[]空list,如果K大于输入的长度也是同样输出为空的 #对输入的数据进行排序,去0:k的数即为所取得的最小的k个数 # n =…
方法一:先排序后寻找前k个数: 方法二:受面试题三十九,寻找超过一半的数的启发,只把里面的middle改成k-1就行: void HalfNum( int [ ] Array ,int k){ int start=0; int end=Array.length-1; int index=Patition(Array ,start ,end); //不求排序,只求不断向中间靠近 while(index!=k){ if(index>k){ end=index-1: } else start=inde…
题目:n个数中,求最小的前k个数. 这道题在各个地方都看到过,在国内出现的频率也非常高. 面完阿里回来听说这道题又被考了,所以还是决定回来写一写,对于这种高频题...顺便再吐槽一下阿里的面试,我竟然一道题都不用做,只是纯粹地过简历...导致我都不知道我究竟错在哪里. 解法: 1. brute force. O(k*n)复杂度: 2. sort.O(k+n*lgn)复杂度: 3. 最大堆.每次替代的是大小为k的最大堆的最大值.O(k+(n-k)lgk)复杂度. int findKthByHeap(…
这是一个经典的算法题,下面给出的算法都在给定的数组基础上进行,好处时不用分配新的空间,坏处是会破坏原有的数组,可以自己分配新的空间以避免对原有数组的破坏. 思路一 先直接排序,再取排序后数据的前k个数. 排序算法用最快的堆排序,复杂度也会达到O(N*logN). void filterDown(int* disorder, int pos, int size){ ; ){ *temppos+<size){ *temppos+]>disorder[*temppos+]){ *temppos+])…
题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 从无序序列,找到最小topk个元素. 解题思路 使用大根堆维护最小topk个元素: - 首先前k个元素建立大根堆(从…
目录 1 问题描述 2 解决方案 2.1 全部排序法 2.2 部分排序法 2.3 用堆代替数组法 2.4线性选择算法   1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. 具体代码如下: package com.liuzhen.array_2; public class SearchMinK { //方法1:全部排序 public void quickSort(int[] A,int s…
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数. 至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可.因此,总的时间复杂度:O(n * log n)+O(k)=O(n * log n). /* * 快速排序法 O…
题目描述:查找最小的k个元素         题目:输入n个整数,输出其中最小的k个.         例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 1:最简单直白的思路是,要求一个序列中最小的k个数,按照惯有的思维方式,很简单,先对这个序列从小到大排序,然后输出前面的最小的k个数即可. 至于选取什么的排序方法,可能会第一时间想到快速排序,我们知道,快速排序平均所费时间为n*logn,然后再遍历序列中前k个元素输出,即可,总的时间复杂度为O(n*logn+…
1 问题描述 有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 2 解决方案 2.1 全部排序法 先对这n个整数进行快速排序,在依次输出前k个数. package com.liuzhen.array_2; public class SearchMinK { //方法1:全部排序 public void quickSort(int[] A,int start,int end){ if(end > start){ int k = LomutoPartition(A,start,end);…
====数组篇==== 2.1 求最小的k个数: 题目描述:有n个整数,请找出其中最小的k个数,要求时间复杂度尽可能低. 解法一: 思路:快排后输出前k个元素,O(nlogn). writer: zzq function: 给定一个数组,寻找数组中最小的k个数. 方法一: 先对数组进行排序(快排), 然后选择前k个数. 快排思想: 分治+挖坑 挖坑: 1) 先找到一个基准值a[i],存到key里面,然后把a[i]挖空: 2) 从j开始往前找(j--),找到第一个比key小的数,就用当前的a[j]…
方法一:对n个整数进行排序(快速排序或堆排序),取出前K个元素(最容易想到的最笨的方法,不可取) 时间复杂度:O(n*logn) + O(k) = O(n*logn) 采用快速排序的代码: #include "stdafx.h" #include <iostream> using namespace std; //划分数组,找到枢轴元素下标,使得其左边的元素都比其小,右边的元素都比其大 int Partition(int nArr[], int nLength) { //初…
参考July的文章:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数题目描述:查找最小的k个元素题目:输入n个整数,输出其中最小的k个.例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. 总体思路: 取n个数字的前k个数字构建大根堆,设根顶元素为kmax, 从n-k+1开始遍历剩余的n-k个元素,取出每一个元素和大根堆根元素进行比较,如果kmax>遍历到的元素值,则kmax=遍历到的元素…
1.题目:输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 快排思路(掌握): class Solution { public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> result; || input.size()<k) return result; ; ; int index…
1. 最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 思路 Java 中的PriorityQueue是一个基于优先级堆的无界优先级队列.优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法.优先级队列不允许使用 null 元素.依靠自然顺序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastExceptio…
练习问题来源 https://wizardforcel.gitbooks.io/the-art-of-programming-by-july/content/02.01.html 要求 输入n个整数,输出其中最小的k个 解法 最直观的思路,先对 n 个数排序,再一次输出 k 个数,用快速排序,时间复杂度为 O(n*logn) 另一种方法,输出的前 k 个最小的数没要求有顺序.可以先取前 k 个数,遍历找到最大的数记 kmax ,再重剩下的 n - k 个数中依次判断是否有 < kmax 的数,若…
题目 输入 n 个整数,找出其中最小的 k 个数.例如输入4.5.1.6.2.7.3.8 这8个数字,则最小的4个数字是1.2.3.4. 初窥 这道题最简单的思路莫过于把输入的 n 个整数排序,排序之后位于最前面的 k 个数就是最小的 k 个数.这种思路的时间复杂度是 O(nlogn). 解法一:脱胎于快排的O(n)的算法 如果基于数组的第 k 个数字来调整,使得比第 k 个数字小的所有数字都位于数组的左边,比第 k 个数字大的所有数字都位于数组的右边.这样调整之后,位于数组中左边的 k 个数字…
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n 个整数,找出其中最小的 k 个数.例如输入4.5.1.6.2.7.3.8 这8个数字,则最小的4个数字是1.2.3.4. 初窥 这道题最简单的思路莫过于把输入的 n 个整数排序,排序之后位于最前面的 k 个数就是最小的 k 个数.这种思路的时间复杂度是 O(nlogn). 解法一:脱胎于快排的O(n)的算法…