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

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

代码实现

#include <stdio.h>

int fun(int D[], int N) {
    // 当数据数量少于2个时,差异认为是0
    if (N < 2) {
        return 0;
    }
    
    // 初始化最大差异为0
    int maxDiff = 0;
    
    // 找出最大值和最小值
    int maxVal = D[0];
    int minVal = D[0];
    for (int i = 1; i < N; i++) {
        if (D[i] > maxVal) {
            maxVal = D[i];
        }
        if (D[i] < minVal) {
            minVal = D[i];
        }
    }
    
    // 计算最大差异
    int diff = maxVal - minVal;
    if (diff > maxDiff) {
        maxDiff = diff;
    }
    
    return maxDiff;
}

int main() {
    int N;
    scanf('%d', &N);
    
    int D[N];
    for (int i = 0; i < N; i++) {
        scanf('%d', &D[i]);
    }
    
    int result = fun(D, N);
    printf('%d\n', result);
    
    return 0;
}

代码解析

  1. 函数fun接收一个整数数组D和数组长度N作为参数,并返回相邻名次间成绩的最大差异。
  2. 当数据数量少于2个时,差异认为是0,直接返回0。
  3. 初始化最大差异maxDiff为0。
  4. 遍历数组,找出最大值maxVal和最小值minVal
  5. 计算最大值和最小值的差值diff,如果diff大于maxDiff,则更新maxDiff
  6. 返回maxDiff

总结

该算法的时间复杂度为O(n),空间复杂度为O(1),满足题目要求。代码简洁易懂,易于理解和实现。

输入样例

5
2 6 8 3 15

输出样例

7

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

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

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

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