`
chriszeng87
  • 浏览: 741331 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编程之美 2.5 寻找最大的K个数

阅读更多

问题: 有很多个无序的数,假定他们各不相等,怎么选出其中最大的若干个数呢?

 

解答:寻找N个数中最大的K个数,本质上就是寻找最大的K个数中最小的那个,也就是寻找第K大的数,可以使用二分搜索的策略。假设N个数中最大的数为Vmax,最小的数为Vmin,那么这N个数中的第K大的数一定在[Vmin,Vmax]之间,可以在这个区间中二分搜索N个数中第K大的数p。

 

#include <stdio.h>
#include <limits.h>

int f(int* a, int length, int mid) {
	//返回a[0...length]中大于等于mid的数的个数
	int num = 0;
	for(int i=0; i<length; i++) {
		if(a[i] >= mid)
			num++;
	}
	return num;
}

int findK(int* a, int length,int max, int min,int k) {
	//返回第K的的数
	int mid;
	while(max > min+1) {
		mid = (max + min)/2;
		if(f(a,length,mid) >= k)
			//若a[0...length]中大于等于mid的数超过k个
			//则说明第k大的数在[mid,max]中
			min = mid;
		else max = mid;
	}
	return min;
}

int main(int argc, char * argv[] ) {
	int array[10]={5,3,9,10,2,6,4,7,1,8};
	int vMin = INT_MAX,vMax = INT_MIN;
	int k=4;

	for(int i=0; i<10; i++) {
		if(array[i] < vMin)
			vMin = array[i];
		if(array[i] > vMax)
			vMax = array[i];
	}


	int themaxK = findK(array,10,vMax,vMin,k);
	printf("The max k number is %d\n",themaxK);

	return 0;
}
 
0
2
分享到:
评论
3 楼 chriszeng87 2011-05-18  
findK函数中while循环的结束条件应该是有问题的
2 楼 chriszeng87 2011-05-17  
AsWater 写道
    如果这是一道面试题,我是主考官,我只能给楼主0分。
    第一,这段代码是基于一个假设“给出的N个数都是整数”,这个假设可能是错误的。
    第二,就是前面一点的假设是正确的,我们要的结果是“选出其中最大的K个数”,而不是“求第K大的数”,要的结果是多个数,不是一个数。就以代码中的例子来说,对于数组{5,3,9,10,2,6,4,7,1,8},给出K=4的时候,我们需要的结果是最大的4个数10,9,8,7,而不是说“第四大的数是7”。


第二点我想解释一下,如果知道“第四大的数是7”,可以遍历一遍数组即可得到所有4个最大的数,找到第四大的数是前面的铺垫,我偷了个懒没写的
1 楼 AsWater 2011-05-17  
    如果这是一道面试题,我是主考官,我只能给楼主0分。
    第一,这段代码是基于一个假设“给出的N个数都是整数”,这个假设可能是错误的。
    第二,就是前面一点的假设是正确的,我们要的结果是“选出其中最大的K个数”,而不是“求第K大的数”,要的结果是多个数,不是一个数。就以代码中的例子来说,对于数组{5,3,9,10,2,6,4,7,1,8},给出K=4的时候,我们需要的结果是最大的4个数10,9,8,7,而不是说“第四大的数是7”。

相关推荐

    程序员编程艺术:面试和算法心得.pdf

    o 2.2 寻找和为定值的两个数 o 2.3 寻找和为定值的多个数 o 2.4 最大连续子数组和 o 2.5 跳台阶 o 2.6 奇偶排序 o 2.7 荷兰国旗 o 2.8 矩阵相乘 o 2.9 完美洗牌 o 2.15 本章习题 第三章 树 o 3.0 本章导读 o 3.1 ...

    CCF历年作业代码

    该代码用于求解一个整数数组中相邻两个元素的最大差值绝对值。 - **输入**:整数`n`和一个长度为`n`的整数数组。 - **过程**:使用`max`函数计算数组中每一对相邻元素之间的差值的绝对值,找出最大的那个值。 - **...

    字节跳动研发岗2019校招笔试(第二批).pdf

    给定一个循环的PM2.5数值序列,需要找到一个子序列,使得序列中的数值始终非降序。可以使用滑动窗口或者单调栈来解决。遍历序列,维护一个单调递增的栈,每次新元素比栈顶元素大就入栈,否则将栈顶元素弹出,直到栈...

    上海交大ACM-ICPC模板

    最大费用完美匹配是指在二分图中找到一个完美匹配,使得所有匹配边的费用之和最大。这个问题可以通过修改匈牙利算法或使用网络流算法来解决。 **2.7 一般图的最大匹配** 对于一般图(非二分图),求解最大匹配问题...

    Josephus问题资料

    假设问题中的报数为k,n个人围成一圈,我们可以定义一个函数\( f(n,k) \)表示当有n个人时最后存活者的编号。当n = 1时,显然\( f(1, k) = 1 \),这是基本情况。 ##### 2.2 递归关系 对于\( n &gt; 1 \)的情况,我们...

    北邮计算机仿真设计报告.doc

    \[ u(k) = K_p e(k) + \frac{K_p}{T_i} \sum_{i=0}^{k} e(i) - K_p T_d \left[ e(k) - e(k-1) \right] \] 或增量式PID控制算法: \[ \Delta u(k) = K_p e(k) + K_i e(k) - K_d [ e(k) - e(k-1) ] \] 其中: - \( ...

    acm入门必备

    - **覆盖集:** 对于图\( G \),一个顶点子集\( K \),若\( G \)中的每条边至少有一个端点属于\( K \),则称\( K \)为\( G \)的一个覆盖集。 - **独立集:** 图\( G \)的一个顶点子集\( I \),其中任何两个顶点都不...

    PID详解.pdf

    这里,\(u(k)\) 表示第k个采样时刻的控制输出,\(e(k)\) 是第k个采样时刻的偏差。 **2.2 增量式PID算法** 增量式PID算法计算的是控制输出的变化量,而不是绝对值。这种算法更易于实现,特别适合于伺服电机等需要...

    ACM知识汇总

    I是极大(最大)独立集,当且仅当G中除I集外的所有顶点是一个极小(最小)覆盖集,即α(G)(覆盖数)十β(G)(覆盖数)=G的顶点数。 - 极大独立集必为极小支配集,但并非所有极小支配集都是极大独立集。 #### 数论 **...

    河南省信阳市2015_2016学年高二数学上学期期中试题理含解析

    15. **最大公约数**:寻找三个数的最大公约数通常用辗转相除法或者更相减损术。 16. **轨迹方程**:根据题目所给的条件,可以确定顶点A的轨迹是一个双曲线的一部分。 17. **命题逻辑**:命题p和q分别对应着不等式...

    python 实现在无序数组中找到中位数方法

    在Python编程中,寻找无序数组的中位数是一项常见的任务,特别是在数据分析和算法设计中。中位数是将一组数值按大小顺序排列后位于中间位置的数,对于偶数个数值,中位数是中间两个数的平均值。在不使用排序的情况下...

    浙大ACM代码模板

    - **组合数**:计算从n个不同元素中取出k个元素的组合数C(n, k)。 - **组合数性质**:包括组合数的递推公式和性质。 ##### 2.2 排列组合生成 - **全排列生成**:生成一个集合的所有可能排列。 - **组合生成**:生成...

    ACM必备内容(几乎全)!!!

    - **覆盖集**:若\( K \)是图\( G \)的一个顶点子集,并且\( G \)的每一条边至少有一个端点属于\( K \),则称\( K \)为\( G \)的一个覆盖。 - **独立集**:若\( I \)是图\( G \)的一个顶点子集,且\( I \)中任意两个...

    ACM浙大的模板 可以直接套用的

    - 寻找图中的最大团(即完全子图)。 - 如使用回溯算法进行搜索。 **6.2 最大团(n)(更快)** - 当图的顶点数小于64时,采用更高效的算法求解最大团问题。 - 如利用位运算优化搜索过程。 #### 七、图论—连通性 **...

    ACM模板-浙大模板浙大模板

    - 找到数组中的第k个元素。 - **13.5 幻方构造** - 构造幻方。 - **13.6 模式匹配(kmp)** - KMP算法在模式匹配中的应用。 - **13.7 逆序对数** - 计算数组中逆序对的数量。 - **13.8 字符串最小表示** - ...

    浙江大学ACM模板(经典代码).pdf

    - **选择问题**:在数组中找到第k个最大的元素。 ##### 13.5 幻方构造 - **幻方**:每个行、列以及两条对角线上的数字之和相等的特殊矩阵。 ##### 13.6 模式匹配(KMP) - **KMP算法**:快速字符串匹配算法,避免...

    经典的C语言算法实例

    - **问题描述**:一个经典的动态规划问题,给出N层楼和K个鸡蛋,问最少需要多少次试验才能确定从哪一层扔鸡蛋会碎。 - **算法思路**:使用动态规划算法,定义状态转移方程,通过递推计算出最少需要的试验次数。 ###...

    福建省计算机二级考试vfp.pdf

    `k`的值被设定为较大的`x`和`y`,然后寻找`x`和`y`的公约数。`i`的值将是它们的最大公约数,即2,答案是(D) 2。 (21305)此题考察`FOR`循环。在循环内部,`x`不断加1,而`i`不变。最后输出`i`和`x`的值,都是0,...

    js代码-4. Median of Two Sorted Arrays

    在编程领域,寻找两个有序数组的中位数是一个常见的问题,尤其在算法和数据结构的学习中。这个问题的挑战在于如何有效地合并两个数组并找到中间值,而不需要完全排序整个数组。在这个问题中,我们主要关注JavaScript...

Global site tag (gtag.js) - Google Analytics