
一起动脑筋 · 先看一个小故事
三张分数卡是 4、9、6。机器人拿第一张当“暂时冠军”,再接受挑战。
把过程摊开来看
- 起步冠军是 4
- 看到 99 更大,换冠军
- 看到 66 不大,保留 9
找最大值时,记录“目前见过的最大值”,每看一个新值就比较并按需更新。
找最小值则把比较方向反过来。一次遍历后,所有值都已挑战过。
01怎样从一堆数里找最大值?
假设数组是:
int a[5] = {7, 2, 9, 4, 6};
最自然的方法是:先把第一个数当作“目前最大”,然后依次比较后面的数。
02第一步:先相信第一个元素
int maximum = a[0];
现在暂时认为最大值是 7。
03第二步:逐个比较并更新
for (int i = 1; i < 5; i++) {
if (a[i] > maximum) {
maximum = a[i];
}
}
开始
max=7
比较 2
不变
比较 9
max=9
比较 4、6
不变
04最小值怎么求?
只要把比较方向反过来:
int minimum = a[0];
for (int i = 1; i < 5; i++) {
if (a[i] < minimum) {
minimum = a[i];
}
}
05为什么不能把最大值初始成 0?
int a[3] = {-8, -2, -5};
如果写:
int maximum = 0;
最终会错误地得到 0,但 0 根本不在数组里。
06空数组怎么办?
普通 C++ 数组声明时通常要有正的元素个数;但以后使用 vector 等容器时,确实可能遇到空序列。
如果没有任何元素,“最大值”就没有自然答案,因此程序必须先处理空数据情况。
你已经知道了什么
- 求最大值可以先把第一个元素作为当前最大值。
- 然后逐个比较,遇到更大的就更新。
- 求最小值只需反转比较方向。
- 不能随便把初值设成 0。
- 对可能为空的数据,必须先处理“没有元素”的情况。
下一篇:怎样求数组的和与平均数?
轮到你来试一试
卡片是 -8、-3、-6,最大值能初始化为 0 吗?
想好了吗?点开看解释
这样会错误地留下 0,而 0 根本不在卡片里。用首项 -8 初始化,最后正确得到 -3。