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