如何获取数组中指定个数的几个最大值

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. 题目来源

链接:1802. 有界数组中指定下标处的最大值

2. 题目解析

直觉的贪心思路,证明看官方题解吧。至于数学思路也推荐看官方题解,一开始确实想着推公式的,最后没走下去。

贪心思路:

  • index 值最大,剩余两边依次递减即可
  • index 值越大,形成后的数组总和越大,越接近 maxSum

所以,可以在不超过 maxSum 二分最大的 arr[index] 是多少即可,也就是二分答案了。

index 作为最大值的下标,如何计算左侧、右侧的元素和,策略如下:

  • 左侧待填充的长度为 index,右侧待填充的长度为 n-index-1
  • 当二分答案值能将这个长度填满时,则意味着这个长度的尾部,不需要用 1 来做最后填充,反之则需要用 1 来做最后填充。
    • 不用 1 填充时,说明 length+1<big 即为等差数列,首项需要单独计算
    • 用 1 填充时,等差数列,首项为 1 / 0

计算过程会超过 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;
        
    
;

以上是关于如何获取数组中指定个数的几个最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用脚本高级服务中指定要在 Google DataStudio 中使用的数组字段?

如何在linux中指定进程名称时仅获取进程ID?

PHP获取二维数组中指定Key的重复Value

PHP获取二维数组中指定Key的重复Value

如何在 map 函数中指定数据类型?

如何在C#中获取连接字符串中指定的Mongo数据库