C语言实现O(n)时间复杂度计算相邻名次成绩最大差异

有时,我们会关心相邻名次间成绩的差异,比如冠军与亚军差多少,第四名与第五名差多少等等。编写函数,计算模拟的成绩数组(均为非负整数,但是是无序的)中相邻的名次间成绩的最大差异(指按从高到低排序后,前一名较后一名相差的最大值)。显然,排序后再统计是一种方法,我们对时间效率有一定的要求:你能否在O(n)的时间和空间复杂度下完成该任务?你可以认为,数据数量少于2个时,差异认为是0。

输入样例:

第一行是长度N,第二行是N个以空格分隔的非负整数。

5
2 6 8 3 15

输出样例:

函数计算并返回有序化后,相邻的两名间最大的差异(第一名15,第二名8,差最大为7)。

7

函数接口定义:

int fun ( int D[],int N );

内容:

思路:

  1. 首先判断数组长度是否小于2,如果小于2,则直接返回0。
  2. 定义两个变量max_diffmin_num,分别用来记录最大差异和当前最小的成绩。
  3. 遍历数组,对于每个成绩D[i],判断D[i]是否大于min_num,如果大于,则更新max_diffmax(max_diff, D[i]-min_num),否则更新min_numD[i]
  4. 遍历结束后,返回max_diff

代码如下:

int fun(int D[], int N) {
    if (N < 2) {
        return 0;
    }
    
    int max_diff = 0;
    int min_num = D[0];
    
    for (int i = 1; i < N; i++) {
        if (D[i] > min_num) {
            max_diff = max(max_diff, D[i] - min_num);
        } else {
            min_num = D[i];
        }
    }
    
    return max_diff;
}
C语言实现O(n)时间复杂度计算相邻名次成绩最大差异

原文地址: https://www.cveoy.top/t/topic/hvcr 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录