矩阵中的幸运数

131 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情

题目描述

给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。 幸运数 是指矩阵中满足同时下列两个条件的元素:
在同一行的所有元素中最小
在同一列的所有元素中最大
来源:力扣(LeetCode)

  • 示例 1
输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]
输出:[15]
解释:15 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
  • 示例 2
输入:matrix = [[1,10,4,2],[9,3,8,7],[15,16,17,12]]
输出:[12]
解释:12 是唯一的幸运数,因为它是其所在行中的最小值,也是所在列中的最大值。
  • 示例 3
输入: matrix = [[7,8],[1,2]]
输出: [7]
解释: 7是唯一的幸运数字,因为它是行中的最小值,列中的最大值。

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= n, m <= 50
  • 1 <= matrix[i][j] <= 10^5
  • 矩阵中的所有元素都是不同的

思路分析

题目给一次矩阵数组,矩阵里面的数字都不一样,需要我们从里面找出幸运数(需要满足两个条件:在同一行的所有元素中最小,同一列的所有元素中最大);对于数组肯定是一定会使用到循环。
首先需要两个for循环取出每一行的最小值放在一个数组里面,取每一列的最大值放在一个数组里;在需要两个for循环,第一个数组的每一个和第二个数组的每一个作对比,只要有相等的,它就是幸运数。

AC代码

let arr = [[3,7,8],[9,11,13],[15,16,17]];
function solution(arr) {
    let m = arr.length;
    let n = arr[0].length;
    let minRow = new Array(m).fill(Number.MAX_SAFE_INTEGER);
    let maxCol = new Array(n).fill(0);
    let res = []
    for( let i = 0; i < m; i++) {
        for(let j = 0; j < n; j++) {
            minRow[i] = Math.min(minRow[i], arr[i][j]);
            maxCol[j] = Math.max(maxCol[j], arr[i][j]);
        }
    }
    for(let i = 0; i< minRow.length; i++) {
        for(let j = 0; j < maxCol.length; j++) {
            if(minRow[i] == maxCol[j]) {
                res.push(minRow[i]);
            }
        }
    }
    return res;
}
solution(arr)

总结