无序数组求第k大/第k小的数】的更多相关文章

问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArray 堆解法 设置一个小根堆,先把前K个数放入小根堆,对于这前K个数来说,堆顶元素一定是第K大的数,接下来的元素继续入堆,但是每入一个就弹出一个,最后,堆顶元素就是整个数组的第K大元素.代码如下: public static int findKthLargest3(int[] nums, int k)…
逛别人博客的时候,偶然看到这一算法题,顺便用C++实现了一下. 最朴素的解法就是先对数组进行排序,返回第n个数即可.. 下面代码中用的是快速选择算法(不晓得这名字对不对) #include <vector> #include <iostream> #include <stdexcept> #include <cstdio> ; /** * 快速选择求无序数组中第n大的数字 * 因为select返回的是数组中对象的引用, * 所以错误处理选择了异常 */ te…
题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45. 输入: 第一行输入无序数组,第二行输入K值. 该是内推滴滴打车时(2017.8.26)的第二题,也是<剑指offer>上最小k个数的变形.当时一看到题,这个不是用快排吗?然后就写了,结果始终没有通过,遗憾的超时提交了.错误点主要在于,这里求的是第K大的数,而若是我们使用K去判断快排得到的下标,得到的是第K个数(等同于排序以后从左往右下标为K-1),而题中隐藏的意思等同于排序以后从 右往左数第K个数.所写在写代码…
从长度为 M 的无序数组中,找出 N个最小的数 在一组长度为 n 的无序的数组中,取最小的 m个数(m < n), 要求时间复杂度 O(m * n) 网易有道面试题 const minTopK = (m, n) => { const obj = {}; for (let i = 0; i < m.length; i++) { if(!obj.hasOwnProperty(m[i])) { obj[m[i]] = 1; } else { obj[m[i]] += 1; } } const…
根据http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html 博客中所总结的7种解法,我挑了其中的解法3和解法6进行了实现. 解法3: 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb.Sa中的元素大于等于X,Sb中元素小于X.这时有两种情况:           1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数:           2. Sa中元素的个数大于等于k,则返回Sa…
Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General of Nlogonia's Army decided to attack the enemy with a linear formation of soldiers, that would advance together until conquering the neighboring count…
给定数组$A[1...N]$, 区间$[L,R]$中第$K$大/小的数的指将$A[L...R]$中的数从大到小/从小到大排序后的第$K$个. "静态"指的是不带修改. 这个问题有多种做法: 1. 归并排序 POJ 2104, 静态区间第K小 #include <bits/stdc++.h> using namespace std; ); ][N]; void merge(int id, int b, int e){ ; for(int l=b, r=mid, i=b; i&…
题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比大于m的数少一.因此,维护比m小和比m大的数就行. m~n进行处理,比m大的cnt++,比m小的cnt--,用vis数组记录每个cnt值的个数. m~1再进行处理,比m大的cnt++,比m小的cnt--,ans+=vis[cnt]+vis[cnt+1],vis[cnt]可以理解为是右边有cnt个比m…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4961    Accepted Submission(s): 1811 Problem Description N(3<=N<=20000) ping pong p…
这题说的给了100000个数有100000次操作 询问 L和R 区间内 在D位上为P的个数,用树状数组存 要开[10][10][100000]的int 开不了但是能开 这么大的unsign short 这样我们将这个树状数组一分为二 50000 个位前面 50000 为后面 我们知道unshort 范围在60000多显然这样是可以开的了 #include <iostream> #include <cstdio> #include <string.h> using nam…