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;
    }
}
posted @ 2022-02-16 11:18  Frontierone  阅读(37)  评论(0编辑  收藏  举报