• LeetCode 1380. 矩阵中的幸运数


    1380. 矩阵中的幸运数

    Solution

    思路:自己的思路就是遍历两遍数组,然后另开计数数组,如果同一个位置被计两次,则为幸运数。时间复杂度和空间复杂度都是O(mn),看了题解是可以在遍历的时候直接判断的,时间复杂度为O(mn*(m+n),空间复杂度为O(1),因为不需要另开保存结果。还有一个方法是保存行的最大值和列的最小值,判断数组的值是否与两个都相等。时间复杂度为O(mn),空间复杂度为O(m+n),因为需要开空间保存行的最大值和列的最小值。

    //方法一:
    class Solution {
        int[][] cnt = new int[50][50];
        public List<Integer> luckyNumbers (int[][] matrix) {
            int m = matrix.length, n = matrix[0].length;
            for (int i = 0; i < m; i++) {
                int tmpi = -1, tmpj = -1;
                int val = Integer.MAX_VALUE;
                for (int j = 0; j < n; j++) {
                    if (matrix[i][j] < val) {
                        tmpi = i; tmpj = j;
                        val = matrix[i][j];
                    }
                }
                cnt[tmpi][tmpj]++;
            }
            for (int i = 0; i < n; i++) {
                int tmpi = -1, tmpj = -1;
                int val = Integer.MIN_VALUE;
                for (int j = 0; j < m; j++) {
                    if (matrix[j][i] > val) {
                        tmpi = i; tmpj = j;
                        val = matrix[j][i];
                    }
                }
                cnt[tmpj][tmpi]++;
            }
            List<Integer> ans = new ArrayList<Integer>();
            for (int i = 0; i < 50; i++) {
                for (int j = 0; j < 50; j++) {
                    if (cnt[i][j] > 1) {
                        ans.add(matrix[i][j]);
                    }
                }
            }
            return ans;
        }
    }
    
    //方法二:
    class Solution {
        public List<Integer> luckyNumbers (int[][] matrix) {
            int m = matrix.length, n = matrix[0].length;
            List<Integer> ans = new ArrayList<Integer>();
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    boolean isMax = true;
                    for (int k = 0; k < n; k++) {
                        if (matrix[i][k] < matrix[i][j]) {
                            isMax = false;
                        }
                    }
                    if (!isMax) {
                        continue;
                    }
                    boolean isMin = true;
                    for (int k = 0; k < m; k++) {
                        if (matrix[k][j] > matrix[i][j]) {
                            isMin = false;
                        }
                    }
                    if (isMin) {
                        ans.add(matrix[i][j]);
                    }
                }
            }
            return ans;
        }
    }
    
    //方法三
    class Solution {
        public List<Integer> luckyNumbers (int[][] matrix) {
            int m = matrix.length, n = matrix[0].length;
            int[] minRow = new int[m];
            Arrays.fill(minRow, Integer.MAX_VALUE);
            int[] maxCol = new int[n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    minRow[i] = Math.min(minRow[i], matrix[i][j]);
                    maxCol[j] = Math.max(maxCol[j], matrix[i][j]);
                }
            }
            List<Integer> ans = new ArrayList<Integer>();
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (minRow[i] == maxCol[j]) {
                        ans.add(matrix[i][j]);
                    }
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    socket发送文字、图片、文件---基于python实现
    python socket详解
    loadrunner socket协议问题归纳(6)
    Hash算法解决冲突的四种方法
    while循环 运算符和编码
    python初识
    js中forEach,for in,for of循环的用法详解
    设计模式之MVC和MVT
    mac 下的 tree 命令 终端展示你的目录树结构
    Mac查看进程
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/15899675.html
Copyright © 2020-2023  润新知