Equal Row and Column Pairs

題目描述

給定 n×n 的整數矩陣 grid,回傳行與列相等的配對數量。一行 r 和一列 c 相等表示它們包含相同的元素且順序相同。

輸入:grid = [[3,2,1],[1,7,6],[2,7,7]]
輸出:1(第 1 行 [3,2,1] 沒有匹配;第 1 列 [3,1,2] 與第 1 行 [3,2,1] 不同⋯只有 1 對匹配)

輸入:grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
輸出:3

解題思路

1

列舉行

將每一行轉為字串鍵,存入 HashMap 計數

2

列舉列

將每一列轉為同格式的字串鍵

3

查字典

若該鍵存在於 HashMap,加上對應的計數

4

回傳

累加所有匹配計數

程式碼

C#

csharp
public class Solution {
    public int EqualPairs(int[][] grid) {
        int n = grid.Length;
        var rowMap = new Dictionary<string, int>();
 
        // 行轉字串存入 HashMap
        for (int r = 0; r < n; r++) {
            string key = string.Join(",", grid[r]);
            rowMap[key] = rowMap.GetValueOrDefault(key) + 1;
        }
 
        // 列轉字串查 HashMap
        int count = 0;
        for (int c = 0; c < n; c++) {
            var colKey = new System.Text.StringBuilder();
            for (int r = 0; r < n; r++) {
                if (r > 0) colKey.Append(",");
                colKey.Append(grid[r][c]);
            }
            count += rowMap.GetValueOrDefault(colKey.ToString());
        }
        return count;
    }
}

TypeScript

typescript
function equalPairs(grid: number[][]): number {
    const n = grid.length;
    const rowMap = new Map<string, number>();
 
    // 行轉字串存入 Map
    for (let r = 0; r < n; r++) {
        const key = grid[r].join(",");
        rowMap.set(key, (rowMap.get(key) ?? 0) + 1);
    }
 
    // 列轉字串查 Map
    let count = 0;
    for (let c = 0; c < n; c++) {
        const colKey = Array.from({ length: n }, (_, r) => grid[r][c]).join(",");
        count += rowMap.get(colKey) ?? 0;
    }
    return count;
}

Python

python
from collections import Counter
 
def equalPairs(grid: list[list[int]]) -> int:
    # 行轉 tuple 存入 Counter
    row_counter = Counter(tuple(row) for row in grid)
 
    count = 0
    n = len(grid)
    for c in range(n):
        col = tuple(grid[r][c] for r in range(n))
        count += row_counter[col]  # Counter 對不存在的鍵回傳 0
    return count

複雜度分析

| | Time | Space | |--|------|-------| | 本解法 | O(n²) | O(n²) |

遍歷所有行和列各 O(n²),HashMap 最多存 n 個長度 n 的鍵。

圖解

n×n grid
逐行建鍵
行 → HashMap
列 → 查 HashMap
配對計數
累加匹配數

進階觀點

💡面試追問

  • 為什麼用字串/tuple 當鍵而不是直接比較陣列? 大多數語言中陣列的相等比較是 reference equality,不是 value equality。轉成字串或 tuple 才能做內容比較。
  • 分隔符為什麼重要? 如果不用分隔符,[1,23] 和 [12,3] 都會變成 "123"。用逗號分隔避免碰撞。
  • O(n³) 暴力法? 對每一行和每一列逐元素比較,三層迴圈。HashMap 方法把內層比較降為 O(1)。

理解測驗

🤔 為什麼 Python 用 tuple 而不是 list 當 HashMap 的鍵?

🤔 如果所有行都相同且所有列也都相同(例如全 1 矩陣),答案是什麼?

你可能也想看

1657. Determine if Two Strings Are Close2390. Removing Stars From a String

按 ← → 鍵切換課程