题解
最大数的位置
1 条题解
-
0
解题思路
题目给出一个 n 行 m 列的二维数组,再给一个位置 (x, y),要找出 a[x][y] 和它四周的元素(上、下、左、右共 4 个)里最大的那个,并输出它所在的行和列。
做法:
- 先把整个二维数组读进数组 a;
- 设 mx 记录最大值,一开始就认为是 a[x][y] 自己,位置记 (rx, ry) = (x, y)。这样做的好处是:如果好几个数并列最大,会优先输出 a[x][y] 自己的位置;
- 依次比较上、下、左、右四个邻居:越界的格子要跳过;只要遇到比 mx 更大的数,就更新 mx 和它的位置;
- 输出位置 (rx, ry)。
方向可以预先放在两个数组里:
- dx 表示“行”方向的变化:上走一格是 -1,下走一格是 +1,左右不变是 0;
- dy 表示“列”方向的变化:左走一格是 -1,右走一格是 +1,上下不变是 0。
用循环遍历 4 个方向,代码更整齐、不容易漏写。
参考代码
// P4434 最大数的位置:在二维数组中找 a[x][y] 及其四周(上下左右)元素中的最大值,输出其行列下标 #include <iostream> using namespace std; int a[105][105]; // 二维数组,最多 100 行 100 列 int main() { int n, m; // n 行 m 列 cin >> n >> m; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> a[i][j]; int x, y; // 给定的数组元素下标 cin >> x >> y; // 先假设 a[x][y] 本身是最大的,这样并列时优先输出它自己的位置 int mx = a[x][y], rx = x, ry = y; // 依次比较上方、下方、左边的数(越界的跳过),只有严格大于才更新 // 这样遇到并列的最大值时,会保留先比较到的那个位置 int dx[4] = {-1, 1, 0, 0}; // 四个方向:上、下、左、右 int dy[4] = {0, 0, -1, 1}; for (int k = 0; k < 4; k++) { int i = x + dx[k], j = y + dy[k]; // 邻居的坐标 if (i < 0 || i >= n || j < 0 || j >= m) continue; // 越界跳过 if (a[i][j] > mx) { // 找到更大的数就更新位置 mx = a[i][j]; rx = i; ry = j; } } cout << rx << " " << ry << endl; // 输出最大值所在的行列下标 return 0; }复杂度分析
- 读入二维数组需要遍历所有格子,时间复杂度是 O(n × m);找最大元素只看了 a[x][y] 自己和上下左右最多 5 个格子,这部分是常数时间。
- 需要存整个二维数组,空间复杂度是 O(n × m)。
- 1