题解
n个整数“打擂台”
1 条题解
-
0
解题思路
这道题要求 n 个整数中的最大值,用的方法叫"打擂台",就像运动会上的擂台赛:
- 先让第一个数当擂主,把它的值记到变量 mx 里;
- 从第二个数开始,每个数都来"挑战"擂主;
- 如果这个数比擂主还大,它就取代擂主的位置(更新 mx);
- 如果它不比擂主大,擂主不变;
- 所有数都比完后,最后站在台上的擂主 mx 就是最大值。
为什么要让第一个数当擂主?因为擂台上一开始必须有个人站着。直接拿第一个数当擂主,后面的数依次来挑战,就一定能找出最大的。注意循环要从第 2 个数开始(i=2),因为第 1 个数已经读过并当了擂主。
代码里先单独读入第一个数 mx,再用 for 循环读剩下的 n-1 个数,每个数与 mx 比较,比它大就更新。
参考代码
#include <iostream> using namespace std; int main() { int n; // n:整数的个数 cin >> n; // 读入个数 n int mx; // mx:当前的最大值(擂主) cin >> mx; // 先读入第一个数,让它当擂主 for (int i = 2; i <= n; i++) { // 从第二个数开始挑战 int x; // x:当前读入的一个整数 cin >> x; // 读入这个数 if (x > mx) { // 如果它比擂主还大 mx = x; // 它就成为新的擂主 } } cout << mx << endl; // 输出最终的最大值 return 0; }复杂度分析
程序循环 n-1 次,每次只做一次比较和可能的赋值,所以时间复杂度是 O(n)。这里 n 表示题目中整数的个数:数的个数越多,需要的比较次数就越多,成正比关系。只用了 n、mx、i、x 几个固定变量,空间复杂度是 O(1)。
- 1