这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战
该题出自力扣的1380题 —— 矩阵中的幸运数【简单题】
审题
给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。
幸运数是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小
在同一列的所有元素中最大
- 首先题目给出一个二维数组,组成的一个矩阵,需要找到在同一行的所有元素最小的值,并且还需要具备另外一个条件—— 这个值在当前的列中元素最大。
- 解决方法也有很多种
- 利用额外开辟的空间,用List去承接结果
- for循环遍历二维数组,确定matrix[i][j]是否是当前的行最小知,并且是当前列的最大值
- 时间复杂度偏高,需要 O(mn(m+n)) ,遍历二维数组需要O(mn),遍历数组的行值需要O(m),遍历数组的列值需要O(n)
- 另外的解决方法:预处理值
- 创建两个数组,一个数组初始化值为Integer.MAX_VALUE去存放行值最小,另外一个默认初始化为0就可以了,因为题意决定了值是>=1
- 遍历二维数组,用Math.max和Math.min求出行值最小和列值最大,并且存放到两个数组内
- 再次遍历二维数组,确认当前值是否存在相应条件,并且加入list
编码
public List<Integer> luckyNumbers (int[][] matrix) {
List<Integer> list = new ArrayList<>(matrix[0].length);
int n = matrix.length,m = matrix[0].length;
int[] minH = new int[n];
int[] maxL = new int[m];
Arrays.fill(minH,Integer.MAX_VALUE);
//行最小
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
minH[i] = Math.min(minH[i],matrix[i][j]);
maxL[j] = Math.max(maxL[j],matrix[i][j]);
}
}
//对比
for (int i = 0; i < n; i++) {
for (int j = 0;j<m;j++){
if (matrix[i][j] == minH[i] && matrix[i][j] == maxL[j]){
list.add(matrix[i][j]);
}
}
}
return list;
}
总结
做题需要注意细节,相关的边界条件,例如说Integer.MAX_VALUE等初始化的值以及for循环的相关条件