寻找最大的k个数】的更多相关文章

Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -----------------------------------------------------------------------------------------   转载自http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/26247…
参考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=遍历到的元素…
编程之美2.5:寻找最大的K个数 引申:寻找第k大的数: 方法一: // 选择第k大的数(通过改进快速排序来实现) public static void SelectShort(int[] array, int low, int high, int k, out int value) { int i = low; int j = high; int tempItem = array[low]; value = int.MinValue; while (low < high) { while (a…
寻找最大的K个数 问题描述 在面试中,有下面的问答: 问:有很多个无序的数,我们姑且假定它们各不相等,怎么选出其中最大的若干个数呢? 答:可以这样写:int array[100] …… 问:好,如果有更多的元素呢? 答:那可以改为:int array[1000] …… 问:如果我们有很多元素,例如1亿个浮点数,怎么办? 答:个,十,百,千,万……那可以写:float array [100 000 000] …… 问:这样的程序能编译运行么? 答:嗯……我从来没写过这么多的0 …… 分析与解法 […
(转:http://www.cnblogs.com/luxiaoxun/archive/2012/08/06/2624799.html) 寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是第K大的数. 可以使用二分搜索的策略来寻找N个数中的第K大的数.对于一个给定的数p,可以在O(N)的时间复杂度内找出所有不小于p的数. 寻找第k大的元素: #include <iostream> using namespace std; //快速排序的划分函数 int partition…
题目描述:查找最小的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+…
这是编程之美书第2.5节的一道题目. 各种解法: 解法一,用nlgn复杂度的排序算法对数组进行从大到小排序,取前K个.但这方法做了两件不必要做的事:它对想得到的K个数进行了排序,对不想得到的n-K个数也进行了排序.方法不可取. 解法二,用选择排序或冒泡排序,复杂度O(NK).但这方法也做了不必要做的一件事:对想得到的K个数进行了排序.方法不可取. 解法三,用顺序统计位(类快排)算法来计算(可参考算法导论).算法导论上说这种方法从平均性能上来讲是线性的,但编程之美上却说复杂度是O(N*lgK).对…
目录 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…
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);…
有若干个互不相等的无序的数,怎么选出其中最大的k个数. 我自己的方案:因为学过找第k大数的O(N)算法,所以第一反应就是找第K大的数.然后把所有大于等于第k大的数取出来. 写这个知道算法的代码都花了2个多小时,反思,太慢了. 注意边界条件,不要混混沌沌的. /************我自己的解法*****************/ //选择数组a[N]中最大的第k个数 int Select(int * a, int N, int k) { if(k > N || a == NULL) { cou…
这个题目是非常经典的一个题目,解法也有很多,现在就把我已经理解的解法记录下来. 题目描述 有n个无序的数,它们各不相等,怎样选出其中的最大的k个数呢? 题目分析: 解法1: 最容易想到的就是把n个数进行排序,然后选择最大的k个数.排序算法很多,快速排序和堆排序都是不错的选择,他们的复杂度都是Ο(n*log2n),然后取出前k个Ο(k),总的时间复杂度可以看成是Ο(n*log2n) 在这个解法中,对n个数进行了排序,如果n的数值非常大的话,会很慢. 解法2: 能不能只遍历一边n个数就能把最大的k个…
接着昨天的写,里面的代码包含昨天的 #include <iostream> using namespace std; #define N 50 //初始化数组 , , , , , , , , , }; //int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; //int a[] = {1, 2, 3, 4, 5, 6}; //int a[] = {6, 2, 3, 9, 4, 10, 1, 20, 40, 5}; ; ; //快速排序,o(nlogn),最应该想…
这是一道很经典的题目,有太多方法了,今天写了两种方法,分别是快排和堆排序 #include <iostream> using namespace std; #define N 25 //初始化数组 //int a[] = {6, 2, 3, 9, 4, 3, 1, 2, 4, 4}; //int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; , , , , , }; ; ; //快速排序,o(nlogn),最应该想到的思路,排好序要多大数就输出多大数 /* pa…
1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) { if(k>n) return; priority_queue<int> q; ;i<n;++i) { if(q.size()<k) q.push(arr[i]); else { if(arr[i]<q.top()) { q.pop(); q.push(arr[i]);…
练习问题来源 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 的数,若…
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个序列从小到大排序,然后输出前面的最小的k个数. 至于选取什么的排序方法,我想你可能会第一时间想到快速排序(我们知道,快速排序平均所费时间为n*logn),然后再遍历序列中前k个元素输出即可.因此,总的时间复杂度:O(n * log n)+O(k)=O(n * log n). /* * 快速排序法 O…
1. 能想到的最直接的办法,就是对数组进行排序,最好的排序算法的时间复杂性为O(n*logn),这一个方法请参照各种排序算法. 2. 另外申请一个k空间数组,依次更改里面的最大值,每做一次最多要扫描一下这个K大小的空间(如果比上一次的最大值大的话,就不用扫描了,所以这里说是“最多”),整体时间复杂度为O((n-k)*k),实现代码如下: #include <iostream> #include <cstdlib> #include <ctime> using names…
<<编程之美>>一书中提到了寻找最大的K个数的问题,问题可以简单描述为:在长度为N的数组中,寻找第K(K<N)个最大的数.问题的解法涉及到了很多排序算法,对我们理解和运用排序算法有较大帮助. 1.解决方案 解决思路一:我们首先可以想到的方法,先对数据进行排序,然后选择K个最大的值,算法时间复杂度O(N*logN) + O(K) = O(N*logN). 解决思路二:注意到题目要求造成K个最大的数,并没有要求这个K个最大的数是否有序.联想到快速排序算法,快速排序算法每一步可以讲…
题目信息 时间: 2019-06-30 题目链接:Leetcode tag: 快排 难易程度:中等 题目描述: 输入整数数组 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] 提示 1.0 <= k <= arr.length <= 10000 2…
题目描述:输入n个整数,输出其中最小的k个元素. 例如:输入1,2,3,4,5,6,7,8这8个数字,则最小的4个数字为1,2,3,4. 思路1:最容易想到的方法:先对这个序列从小到大排序,然后输出前面的最小的k个数即可.如果选择快速排序法来进行排序,则时间复杂度:O(n*logn) 思路2:在思路1的基础上更进一步想想,题目并没有要求要查找的k个数,甚至后n-k个数是有序的,既然如此, 咱们又何必对所有的n个数都进行排序列?如此,我们能想打的一个方法是:遍历n个数,先把最先遍历到得k个数存入大…
http://blog.csdn.net/realxie/article/details/8078043 假设有长度分为为M和N的两个升序数组A和B,在A和B两个数组中查找第K大的数,即将A和B按升序合并后的第K个数. 解法一: 使用两个指针指向A和B的开头,很容易在O(M+N)的时间内完成,此算法略过. 解法二: 使用二分的方法.算法思想在代码注释中 #include <iostream> #include <string.h> #include <stdlib.h>…
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情况下可以模拟其他数据结构,Queue库提供了栈和队列,甚至优先队列(和最小堆类似),heapq提供了最小堆,树,链表的指针在python中可以当作最普通的变量,所以python大法好...使用python确实可以把程序员从复杂的数据结构中解放开来,重点关注算法.好了言归正传. 题目 前几天看到了一个…
对于"从一组数中挑出最大的K个数"这个在面试中经常会遇到,所以这次好好的去解析它,而当拿到这个问题时第一时间能想到解法就是:先对数据进行排序,然后再取最大的K个元素,当然这思路没毛病,但是对于数据量非常大(如:一万个数)的情况是不是先对它进行排序的代价太高了,有木有比较优的解法呢?当然有,那就是采用上篇学习到的利用二叉堆排序去解决. 定义二叉堆结构: 首先是需要用代码去实现一个堆这样的数据结构,而堆的特性在上篇[http://www.cnblogs.com/webor2006/p/76…
题目:n个数中,求最小的前k个数. 这道题在各个地方都看到过,在国内出现的频率也非常高. 面完阿里回来听说这道题又被考了,所以还是决定回来写一写,对于这种高频题...顺便再吐槽一下阿里的面试,我竟然一道题都不用做,只是纯粹地过简历...导致我都不知道我究竟错在哪里. 解法: 1. brute force. O(k*n)复杂度: 2. sort.O(k+n*lgn)复杂度: 3. 最大堆.每次替代的是大小为k的最大堆的最大值.O(k+(n-k)lgk)复杂度. int findKthByHeap(…
包含了Partition函数的多种用法 以及大顶堆操作 /************************************************************************* > File Name: 28_KLeastNumbers.cpp > Author: Juntaran > Mail: JuntaranMail@gmail.com > Created Time: 2016年08月31日 星期三 19时45分41秒 **************…
====数组篇==== 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个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定partition函数的哨兵为key=lists[left],在partition函数中完成一轮比较的结果是,比key大的数都在其右边,比key小的数放在其左边.完成该轮后返回其left=right时left的值. ②我们判断left的值是比k大还是小: 如果left的值比k大,说明上轮partition之…
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来源:牛客网 无序数组中最小的k个数 对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数,顺序与原数组中元素顺序一致. 给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数. 测试样例: [1,2,4,3],4,2 返回:[1,2] 代码 需要保留K个较小的元素,可以删…
方法一:先排序后寻找前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…
快速选择 第k个数 题目描述 给定一个序列,求第k小的数 算法思想 利用快速排序思想,算法复杂度能达到O(n)步骤如下: 1.找到排序分界点x,这里选择区间最左值 2.排序,让左边的值都小于x,右边都大于x 3.递归排序寻找数字,如果左区间数字数目大于k,直接在左边找第k小的数字,如果左区间数字数目小于k,则在右边找 模板 #include<bits/stdc++.h> using namespace std; int n, k; const int maxn = 1e5 + 10; int…