2352.相等行列对(C++,哈希表)

文章介绍了如何在给定的n×n整数矩阵中寻找行和列相等的行列对。提出了两种方法,包括简单的遍历比较和利用哈希表存储后查找,这两种方法都不会导致超时。文中强调了在遍历过程中利用空间局部性优化,通过一列一列存储和比较来提高效率。最后给出了一段C++代码实现,该代码逐列存储数据并逐行比较,找到满足条件的行列对数量。
摘要由CSDN通过智能技术生成

给你一个下标从 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

分析:

行列匹配:

最简单的就是遍历,一个一个的比较看是否相等;(O(n^3))

第二个就是将一行(一列)存放进入哈希表,再通过find函数查找,看是否存在;(O(n^2))

但两种方法都可以,都不会超时

第一种遍历:、

我在这里是一列一列进行的匹配;

首先:将一列的数据存放在num数列中,然后一行一行的去匹配;

这样子在匹配过程中,从二维数组中拿数据是一行一行的拿,符合空间局部性;缓存命中率高;

比一列一列的比高效;

简要:一列与每一行想比较;然后再换一列与每一行比较;

比一行与每一列比较;然后换一行与每一列比较;更快

(其中局部性原理可以深入了解);

class Solution {
public:
#define dp 201
int num[dp];
    int equalPairs(vector<vector<int>>& grid) {//行列匹配??
        int number=0;//用于记录有多少组数据满足条件
    int len=grid[0].size();//此处使用len=grid.size();也是可以的;(因为其为正方形,行列数相等)
    int now=0;//现在匹配到了第几列
    int flag=1;
    while(flag){    
        for(int i=0;i<len;i++){
            num[i]=grid[i][now];//先将其存放在一个数组中,可以使程序获得更好的空间局部性
        }
        for(int i=0;i<len;i++){
            int j=0;
            for(j=0;j<len;j++){
                if(grid[i][j]!=num[j])break;
            }
            if(j==len){
              //  cout<<"now:"<<now<<"i:"<<i<<endl;
                number++;
            }
        }
        now++;//每循环一次now++
        //设置循环跳出条件
        if(now==len)flag=0;
    }   
    return number; 
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值