问题: 有很多个无序的数,假定他们各不相等,怎么选出其中最大的若干个数呢?
解答:寻找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;
}
分享到:
相关推荐
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 ...
该代码用于求解一个整数数组中相邻两个元素的最大差值绝对值。 - **输入**:整数`n`和一个长度为`n`的整数数组。 - **过程**:使用`max`函数计算数组中每一对相邻元素之间的差值的绝对值,找出最大的那个值。 - **...
给定一个循环的PM2.5数值序列,需要找到一个子序列,使得序列中的数值始终非降序。可以使用滑动窗口或者单调栈来解决。遍历序列,维护一个单调递增的栈,每次新元素比栈顶元素大就入栈,否则将栈顶元素弹出,直到栈...
最大费用完美匹配是指在二分图中找到一个完美匹配,使得所有匹配边的费用之和最大。这个问题可以通过修改匈牙利算法或使用网络流算法来解决。 **2.7 一般图的最大匹配** 对于一般图(非二分图),求解最大匹配问题...
假设问题中的报数为k,n个人围成一圈,我们可以定义一个函数\( f(n,k) \)表示当有n个人时最后存活者的编号。当n = 1时,显然\( f(1, k) = 1 \),这是基本情况。 ##### 2.2 递归关系 对于\( n > 1 \)的情况,我们...
\[ 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) ] \] 其中: - \( ...
- **覆盖集:** 对于图\( G \),一个顶点子集\( K \),若\( G \)中的每条边至少有一个端点属于\( K \),则称\( K \)为\( G \)的一个覆盖集。 - **独立集:** 图\( G \)的一个顶点子集\( I \),其中任何两个顶点都不...
这里,\(u(k)\) 表示第k个采样时刻的控制输出,\(e(k)\) 是第k个采样时刻的偏差。 **2.2 增量式PID算法** 增量式PID算法计算的是控制输出的变化量,而不是绝对值。这种算法更易于实现,特别适合于伺服电机等需要...
I是极大(最大)独立集,当且仅当G中除I集外的所有顶点是一个极小(最小)覆盖集,即α(G)(覆盖数)十β(G)(覆盖数)=G的顶点数。 - 极大独立集必为极小支配集,但并非所有极小支配集都是极大独立集。 #### 数论 **...
15. **最大公约数**:寻找三个数的最大公约数通常用辗转相除法或者更相减损术。 16. **轨迹方程**:根据题目所给的条件,可以确定顶点A的轨迹是一个双曲线的一部分。 17. **命题逻辑**:命题p和q分别对应着不等式...
在Python编程中,寻找无序数组的中位数是一项常见的任务,特别是在数据分析和算法设计中。中位数是将一组数值按大小顺序排列后位于中间位置的数,对于偶数个数值,中位数是中间两个数的平均值。在不使用排序的情况下...
- **组合数**:计算从n个不同元素中取出k个元素的组合数C(n, k)。 - **组合数性质**:包括组合数的递推公式和性质。 ##### 2.2 排列组合生成 - **全排列生成**:生成一个集合的所有可能排列。 - **组合生成**:生成...
- **覆盖集**:若\( K \)是图\( G \)的一个顶点子集,并且\( G \)的每一条边至少有一个端点属于\( K \),则称\( K \)为\( G \)的一个覆盖。 - **独立集**:若\( I \)是图\( G \)的一个顶点子集,且\( I \)中任意两个...
- 寻找图中的最大团(即完全子图)。 - 如使用回溯算法进行搜索。 **6.2 最大团(n)(更快)** - 当图的顶点数小于64时,采用更高效的算法求解最大团问题。 - 如利用位运算优化搜索过程。 #### 七、图论—连通性 **...
- 找到数组中的第k个元素。 - **13.5 幻方构造** - 构造幻方。 - **13.6 模式匹配(kmp)** - KMP算法在模式匹配中的应用。 - **13.7 逆序对数** - 计算数组中逆序对的数量。 - **13.8 字符串最小表示** - ...
- **选择问题**:在数组中找到第k个最大的元素。 ##### 13.5 幻方构造 - **幻方**:每个行、列以及两条对角线上的数字之和相等的特殊矩阵。 ##### 13.6 模式匹配(KMP) - **KMP算法**:快速字符串匹配算法,避免...
- **问题描述**:一个经典的动态规划问题,给出N层楼和K个鸡蛋,问最少需要多少次试验才能确定从哪一层扔鸡蛋会碎。 - **算法思路**:使用动态规划算法,定义状态转移方程,通过递推计算出最少需要的试验次数。 ###...
`k`的值被设定为较大的`x`和`y`,然后寻找`x`和`y`的公约数。`i`的值将是它们的最大公约数,即2,答案是(D) 2。 (21305)此题考察`FOR`循环。在循环内部,`x`不断加1,而`i`不变。最后输出`i`和`x`的值,都是0,...
在编程领域,寻找两个有序数组的中位数是一个常见的问题,尤其在算法和数据结构的学习中。这个问题的挑战在于如何有效地合并两个数组并找到中间值,而不需要完全排序整个数组。在这个问题中,我们主要关注JavaScript...