【每日一题Day229】LC2352相等行列对 | 哈希

简介: 【每日一题Day229】LC2352相等行列对 | 哈希

相等行列对【LC2352】

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

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

映射+哈希表
  • 思路
    将每个数字映射为字符,那么可以将每行每列用字符串表示,然后求出每行对应的字符串及其出现次数,再求出每列对应的字符串,如果存在相同的行,那么累加行出现的次数
  • 实现
class Solution {
    public int equalPairs(int[][] grid) {
        int n = grid.length;
        int res = 0;
        HashMap<String, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++){
            StringBuilder row = new StringBuilder();
            for (int j = 0; j < n; j++){
                row.append((char)('0' + grid[i][j]));
            }
            map.put(row.toString(), map.getOrDefault(row.toString(), 0) + 1);           
        }
        for (int i = 0; i < n; i++){
            StringBuilder col = new StringBuilder();
            for (int j = 0; j < n; j++){
                col.append((char)('0' + grid[j][i]));
            }
            res += map.getOrDefault(col.toString(), 0);          
        }
        return res;
    }
}

复杂度

  • 时间复杂度:O(n3)双重循环O(n2)+字符串放入哈希表O(n)
  • 空间复杂度O(n2)
字符串哈希
  • 思路不熟悉字符串哈希的看这里将每行每列使用字符串哈希算法进行编码,其他同上
  • grid[i][j]相当于某个字符的整数形式,所以1-11和11-1所代表的值是不同的
  • 实现
class Solution {
    public int equalPairs(int[][] grid) {
        int n = grid.length;
        int base = 7;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++){
            int h = 0;
            for (int j = 0; j < n; j++){
                h = h * base + grid[i][j];
            }
            map.put(h, map.getOrDefault(h, 0) + 1);
        }
        int res = 0;
        for (int i = 0; i < n; i++){
            int h = 0;
            for (int j = 0; j < n; j++){
                h = h * base + grid[j][i];
            }
            res += map.getOrDefault(h, 0);          
        }
        return res;
    }
}

复杂度

  • 时间复杂度:O(n2),双重循环O(n2)+数字放入哈希表O(1)
  • 空间复杂度:O(n)
目录
相关文章
|
7月前
【每日一题Day176】LC2404出现最频繁的偶数元素 | 哈希表
【每日一题Day176】LC2404出现最频繁的偶数元素 | 哈希表
57 0
【每日一题Day176】LC2404出现最频繁的偶数元素 | 哈希表
|
7月前
|
存储
【每日一题Day158】LC2395和相等的子数组 | 哈希表
【每日一题Day158】LC2395和相等的子数组 | 哈希表
37 0
|
7月前
|
存储
【每日一题Day113】LC1797设计一个验证系统 | 哈希表
【每日一题Day113】LC1797设计一个验证系统 | 哈希表
47 0
|
7月前
|
机器学习/深度学习
【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序
【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序
43 0
|
7月前
【每日一题Day136】LC982按位与为零的三元组 | 哈希表
【每日一题Day136】LC982按位与为零的三元组 | 哈希表
68 0
|
7月前
|
存储 缓存
【每日一题Day336】LC146最近最少使用缓存 | 哈希表+链表
【每日一题Day336】LC146最近最少使用缓存 | 哈希表+链表
53 0
|
7月前
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
【每日一题Day163】LC2367算术三元组的数目 | 二分查找 哈希表
32 0
|
7月前
|
存储 人工智能 BI
【每日一题Day147】LC1615最大网络秩 | 枚举 哈希表
【每日一题Day147】LC1615最大网络秩 | 枚举 哈希表
55 0
|
7月前
|
API 索引
【每日一题Day346】LC1488避免洪水泛滥 | 贪心+哈希表
【每日一题Day346】LC1488避免洪水泛滥 | 贪心+哈希表
56 0
|
7月前
【每日一题Day252】LC1两数之和 | 哈希表
【每日一题Day252】LC1两数之和 | 哈希表
40 0