C语言实现相邻名次成绩最大差异计算:O(n)时间复杂度
C语言实现相邻名次成绩最大差异计算:O(n)时间复杂度
问题描述:
有时,我们会关心相邻名次间成绩的差异,比如冠军与亚军差多少,第四名与第五名差多少等等。编写函数,计算模拟的成绩数组(均为非负整数,但是是无序的)中相邻的名次间成绩的最大差异(指按从高到低排序后,前一名较后一名相差的最大值)。显然,排序后再统计是一种方法,我们对时间效率有一定的要求:你能否在O(n)的时间和空间复杂度下完成该任务?你可以认为,数据数量少于2个时,差异认为是0。
代码实现:
int fun(int D[], int N) {
if (N < 2) {
return 0;
}
int maxDiff = 0;
int maxScore = D[0];
for (int i = 1; i < N; i++) {
if (D[i] > maxScore) {
maxScore = D[i];
} else {
int diff = maxScore - D[i];
if (diff > maxDiff) {
maxDiff = diff;
}
}
}
return maxDiff;
}
代码解释:
-
函数定义:
int fun(int D[], int N) { ... }函数
fun接受一个整数数组D和数组长度N作为参数,并返回相邻名次成绩的最大差异。 -
边界条件处理:
if (N < 2) { return 0; }当数组长度小于 2 时,直接返回 0,因为此时没有相邻名次。
-
初始化:
int maxDiff = 0; int maxScore = D[0];maxDiff用于存储最大差异,初始化为 0。maxScore用于存储当前遍历到的最大成绩,初始化为数组第一个元素D[0]。 -
遍历数组:
for (int i = 1; i < N; i++) { ... }循环遍历数组
D,从第二个元素开始(索引为 1)。 -
更新最大成绩:
if (D[i] > maxScore) { maxScore = D[i]; }如果当前遍历到的元素
D[i]大于maxScore,则更新maxScore。 -
计算差异并更新最大差异:
else { int diff = maxScore - D[i]; if (diff > maxDiff) { maxDiff = diff; } }如果当前元素
D[i]不大于maxScore,则计算当前元素与maxScore的差异diff。如果diff大于maxDiff,则更新maxDiff。 -
返回结果:
return maxDiff;最终返回
maxDiff,即相邻名次成绩的最大差异。
算法分析:
该算法仅遍历一次数组,时间复杂度为 O(n)。此外,算法仅使用了一些常数空间,空间复杂度为 O(1)。
示例:
输入:
5
2 6 8 3 15
输出:
7
解释:
函数计算并返回有序化后,相邻的两名间最大的差异(第一名15,第二名8,差最大为7)。
总结:
本程序通过高效的算法实现了在 O(n) 时间复杂度内计算相邻名次成绩最大差异的功能,并提供了详细的代码实现和解
原文地址: https://www.cveoy.top/t/topic/hu9o 著作权归作者所有。请勿转载和采集!