如何获取数组中指定个数的几个最大值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取数组中指定个数的几个最大值相关的知识,希望对你有一定的参考价值。
让数组元素按从大到小排队,然后取出前几个最大值。程序例子如下:
#include <stdio.h>
void fun(float *a, int a_size, int num)
int i,j;
float t;
for (i=0;i<a_size-1;i++) for (j=i+1;j<a_size;j++)
if (a[i]<a[j]) t=a[i];a[i]=a[j];a[j]=t;;
if (num>a_size)num=a_size;
for (i=0;i<num;i++) printf("%g ",a[i]);
main()
float a[10]=1,8,7,4,5,6,7,2,3,10;
int num=4;
fun(a, 10, num);
return 0;
参考技术A #include <stdio.h> int main() float a[3]=10,10,1,max=0; int i=0,maxnum=0; int c[3]=-1,-1,-1; for(i=0;i<=2;i++) if(max<a[i]) max=a[i]; c[j++] = i+1; else if (max==a[i]) c[j++] = i+1; for (i=0;i<3;i++) if (c[i]!=-1) printf("the number of the highest is a[%d]=[%.2f]\n",c[i]-1,a[c[i]-1]); return 0;the number of the highest is a[0]=[10.00]the number of the highest is a[1]=[10.00]Press any key to continue
[M数学] lc1802. 有界数组中指定下标处的最大值(贪心+二分+数学推公式)
文章目录
1. 题目来源
2. 题目解析
直觉的贪心思路,证明看官方题解吧。至于数学思路也推荐看官方题解,一开始确实想着推公式的,最后没走下去。
贪心思路:
- 让
index
值最大,剩余两边依次递减即可 index
值越大,形成后的数组总和越大,越接近maxSum
所以,可以在不超过 maxSum
二分最大的 arr[index]
是多少即可,也就是二分答案了。
index
作为最大值的下标,如何计算左侧、右侧的元素和,策略如下:
- 左侧待填充的长度为
index
,右侧待填充的长度为n-index-1
- 当二分答案值能将这个长度填满时,则意味着这个长度的尾部,不需要用 1 来做最后填充,反之则需要用 1 来做最后填充。
- 不用 1 填充时,说明
length+1<big
即为等差数列,首项需要单独计算 - 用 1 填充时,等差数列,首项为 1 / 0
- 不用 1 填充时,说明
计算过程会超过 int
,需要开 long
。
- 时间复杂度: O ( l o g n ) O(log_n) O(logn)
- 空间复杂度: O ( 1 ) O(1) O(1)
class Solution
public:
int maxValue(int n, int index, int maxSum)
int l = 1, r = maxSum; // 二分最大值
while (l < r)
int mid = l + r + 1 >> 1;
if (check(mid, n, index, maxSum)) l = mid;
else r = mid - 1;
return r;
// 最大值是 mid,左侧长度为 index(不包括 mid) 右侧长度为 n - index - 1(不包括mid)
bool check(int mid, int n, int index, int maxSum)
int ll = index, lr = n - index - 1;
return mid + cal(mid, ll) + cal(mid, lr) <= maxSum;
// 如果 长度+1 < 最大值的话,说明最大值依次递减到数组端点处,还有余值,不用一味填充1
// 如果 长度+1 >= 最大值的话,说明最大值依次递减到数组断点处,没有余值了,后面的一部分需要填充1了
// 需要注意不要报 long 了
long cal(int big, int length)
if (length + 1 < big)
int a0 = big - length, an = big - 1;
return (long)(an + a0) * length / 2;
else
int ones = length - (big - 1);
return (long)big * (big - 1) / 2 + ones;
;
以上是关于如何获取数组中指定个数的几个最大值的主要内容,如果未能解决你的问题,请参考以下文章