算法小知识-------02·15-------矩阵中的幸运数

128 阅读2分钟

这是我参与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;
   }

image.png

总结

做题需要注意细节,相关的边界条件,例如说Integer.MAX_VALUE等初始化的值以及for循环的相关条件