矩阵中的幸运数

标签: 数组 矩阵

难度: Easy

给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。

幸运数 是指矩阵中满足同时下列两个条件的元素:

  • 在同一行的所有元素中最小
  • 在同一列的所有元素中最大

示例 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
  • 矩阵中的所有元素都是不同的

Submission

运行时间: 24 ms

内存: 16.4 MB

class Solution:
    def luckyNumbers (self, matrix: List[List[int]]) -> List[int]:
        m, n = len(matrix), len(matrix[0])
        row_min = [min(matrix[i][j] for j in range(n)) for i in range(m)]
        col_max = [max(matrix[i][j] for i in range(m)) for j in range(n)]
        ans = []
        for i, row in enumerate(matrix):
            for j, x in enumerate(row):
                if row_min[i] == col_max[j] == x:
                    ans.append(x)
        return ans

Explain

这个题解的核心思路是首先分别计算矩阵中每一行的最小值和每一列的最大值。对于每一行,找到其中的最小元素,并存储在列表 row_min 中。对于每一列,找到其中的最大元素,并存储在列表 col_max 中。之后,遍历整个矩阵的每一个元素,检查该元素是否既是所在行的最小值也是所在列的最大值。如果是,那么这个元素就是一个幸运数,并将其添加到结果列表 ans 中。

时间复杂度: O(mn)

空间复杂度: O(m + n)

class Solution:
    def luckyNumbers (self, matrix: List[List[int]]) -> List[int]:
        m, n = len(matrix), len(matrix[0])
        # 计算每一行的最小值
        row_min = [min(matrix[i][j] for j in range(n)) for i in range(m)]
        # 计算每一列的最大值
        col_max = [max(matrix[i][j] for i in range(m)) for j in range(n)]
        ans = []
        # 遍历矩阵中的每个元素,检查是否是幸运数
        for i, row in enumerate(matrix):
            for j, x in enumerate(row):
                if row_min[i] == col_max[j] == x:
                    ans.append(x)
        return ans

Explore

在算法中,我们分别计算每一行的最小值和每一列的最大值。对于每一行的最小值,我们对该行的所有元素进行遍历,找到最小的一个;对于每一列的最大值,则遍历该列的所有元素,寻找最大的一个。由于这里的行和列遍历是独立的,且每次我们只关心行内或列内的元素,遍历顺序不会影响到最终的最小值和最大值的计算。因此,不存在遍历顺序导致计算错误的问题。

当矩阵只有一行时,该行的最小值同时也是这行的所有元素,而每一列的最大值也将是该元素自身,相似的逻辑适用于只有一列的情况。在这种极端情况下,算法仍然适用,不需要特别处理。每一个元素都会被检查是否同时是其行的最小值和列的最大值,因此,算法能正确处理单行或单列的情况。

元素的正负不会影响找幸运数的逻辑。幸运数的定义是基于元素是否是所在行的最小值和所在列的最大值,这个判断与元素的正负无关。无论元素是正数、负数还是零,算法都是通过比较确定是否满足幸运数的条件。因此,元素的正负不会对找幸运数的过程产生任何影响。

在实际实现中,如果矩阵中出现了重复元素,算法仍然可以正常运行,因为它独立地检查每个元素是否满足既是其行的最小值也是列的最大值的条件。即使有重复元素,这种检查不会受到影响。如果题目假设矩阵中的元素各不相同,实际输入却有重复,只要保证算法逻辑正确执行,即可正确地识别出所有幸运数。重复元素可能会导致多个相同的幸运数结果,但这不会影响算法的正确性和运行。