Java二维矩阵首个最大值位置查找代码故障求助及修正
问题分析与代码修正
我看了你的代码,发现两个核心问题导致无法正确输出第一个最大值的位置:
- 最大值初始化错误:你把
max初始化为0,如果矩阵里的元素全是负数,这个初始值会比所有元素都大,导致找不到真正的最大值。 - 最后一轮循环的逻辑漏洞:内层循环里的
break放在了if判断外面,这意味着不管当前元素是不是最大值,内层循环只执行一次(j=0的时候就直接退出了),根本没法遍历每行的后续元素。
修正后的完整代码
import java.util.Scanner; class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[][] matrix = new int[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { matrix[i][j] = sc.nextInt(); } } // 修正1:用矩阵第一个元素初始化最大值,适配所有数值场景 int max = matrix[0][0]; // 遍历矩阵找出最大值 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (matrix[i][j] > max) { max = matrix[i][j]; } } } // 修正2:调整循环逻辑,找到第一个最大值后立即终止所有遍历 boolean found = false; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (matrix[i][j] == max) { System.out.print(i + " " + j); found = true; break; // 找到当前行的目标,退出内层循环 } } if (found) { break; // 已经找到第一个最大值,退出外层循环 } } sc.close(); // 记得关闭Scanner,养成良好习惯 } }
关键修正说明
- 最大值初始化:改用
matrix[0][0]作为max的初始值,确保无论矩阵元素是正数、负数还是零,都能从矩阵实际存在的元素开始比较,避免初始值干扰。 - 循环逻辑修复:添加
found布尔标记,当找到第一个匹配最大值的元素时,先打印位置,标记为已找到,然后依次退出内层和外层循环,保证只会输出第一个出现的最大值位置,不会继续遍历后续元素。
如果你想进一步优化,可以把找最大值和找位置合并成一次遍历,减少一次矩阵扫描,比如:
// 合并遍历的优化版本 int max = matrix[0][0]; int maxI = 0, maxJ = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (matrix[i][j] > max) { max = matrix[i][j]; maxI = i; maxJ = j; } } } System.out.print(maxI + " " + maxJ);
这个版本只需要遍历矩阵一次,效率更高,同时也能直接记录第一个最大值的位置(因为只有当遇到更大的值时才更新位置,第一次出现的最大值会被保留到最后)。
内容的提问来源于stack exchange,提问作者Ashu.exe
相关产品推荐
相关产品推荐

