leetcode
leetcode 2001 ~ 2050
相等行列对

相等行列对

难度:

标签:

题目描述

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目

如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

 

示例 1:

输入:grid = [[3,2,1],[1,7,6],[2,7,7]]
输出:1
解释:存在一对相等行列对:
- (第 2 行,第 1 列):[2,7,7]

示例 2:

输入:grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
输出:3
解释:存在三对相等行列对:
- (第 0 行,第 0 列):[3,1,2,2]
- (第 2 行, 第 2 列):[2,4,2,2]
- (第 3 行, 第 2 列):[2,4,2,2]

 

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • 1 <= grid[i][j] <= 105

代码结果

运行时间: 51 ms, 内存: 20.4 MB


/*
 * Solution for LeetCode problem using Java Streams: 
 * Given a 2D integer matrix grid of size n x n, return the number of pairs (Ri, Cj) where the i-th row and j-th column are equal.
 * Two arrays are considered equal if they contain the same elements in the same order.
 */

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.IntStream;

public class EqualRowColumnPairsStream {
    public int equalPairs(int[][] grid) {
        int n = grid.length;
        Map<String, Long> rowCount = new HashMap<>();
        for (int[] row : grid) {
            String key = Arrays.toString(row);
            rowCount.put(key, rowCount.getOrDefault(key, 0L) + 1);
        }
        return (int) IntStream.range(0, n).flatMap(j -> {
            int[] col = new int[n];
            for (int i = 0; i < n; i++) {
                col[i] = grid[i][j];
            }
            String key = Arrays.toString(col);
            return rowCount.getOrDefault(key, 0L).intValue();
        }).sum();
    }

    public static void main(String[] args) {
        EqualRowColumnPairsStream solution = new EqualRowColumnPairsStream();
        int[][] grid1 = { {3, 2, 1}, {1, 7, 6}, {2, 7, 7} };
        int[][] grid2 = { {3, 1, 2, 2}, {1, 4, 4, 5}, {2, 4, 2, 2}, {2, 4, 2, 2} };
        System.out.println(solution.equalPairs(grid1)); // Output: 1
        System.out.println(solution.equalPairs(grid2)); // Output: 3
    }
}

解释

方法:

该题解首先将矩阵的每一行转换为元组并存储在列表a中。使用collections.Counter计算列表a中每种元组出现的次数,存储在a1中。然后,它遍历矩阵的每一列(通过对grid使用zip(*)来获得列),并检查每个列元组在a1中的出现次数。如果该列元组存在于a1中,则将其计数加到总数c中。最终,返回总数c,即相等的行列对的数量。

时间复杂度:

O(n^2)

空间复杂度:

O(n^2)

代码细节讲解

🦆
为什么在计算行元组时选择使用元组而不是列表?
在Python中,元组(tuple)是不可变的数据结构,而列表(list)是可变的。这种不可变性使得元组可以用作字典的键或集合的元素,这在需要唯一性和哈希性质时非常有用。在题解中,使用collections.Counter来统计每种行元组出现的次数,而Counter需要能够对其元素进行哈希操作。由于列表不能被哈希(因为它们是可变的),所以选择使用元组来代表每行的内容。此外,使用元组还可以在内部实现中提供比列表更好的性能优势,尤其是在空间使用和访问速度方面。
🦆
题解提到变量`b`未被使用,这是否意味着代码存在冗余,如何改进代码以提高其效率和可读性?
是的,变量`b`在代码中被声明但未被使用,这确实表示代码中存在冗余。移除未使用的变量不仅可以减少资源消耗(尽管在这种情况下影响微小),更重要的是可以提高代码的清晰度和可维护性。改进代码的一种方法是直接删除或注释掉变量`b`的声明行。这样,代码不仅看起来更加整洁,而且对于其他阅读或维护代码的开发者来说,理解代码的意图和结构也更为容易。

相关问题