题目链接:找出叠涂元素
解读题干:
现有一个数组和一个矩阵,两者包含相同的元素,但其顺序不同;
从0开始遍历数组,并将矩阵中相同元素的位置涂色;
若矩阵中第一次有某一行或者某一列被全部涂色,则返回此时数组遍历到的位置。
思路分析:
由于数组中的数字是各不相同的,所以数组中的每个数字在矩阵中都只有唯一的位置,为了减少时间复杂度,先对矩阵进行一次遍历,并采用哈希表将矩阵中每个数字的位置进行记录。
遍历数组,并根据哈希表判断数组中每个数在矩阵中的行和列,新建两个数组分别维护矩阵各行和各列上已经被染色的个数,当某行或者某列被染色的个数等于该行或者该列的长度,返回此时数组遍历到的位置。
class Solution {
public:
int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& mat) {
unordered_map<int, int> mat_map(mat.size() * mat.front().size());
vector<int> raw(mat.size()), column(mat.front().size());
bool flag1, flag2;
for(int i = 0; i < mat.size(); ++i){
for(int j = 0; j < mat.front().size(); ++j){
mat_map[mat[i][j]] = i * mat.front().size() + j;
}
}
int ans = 0;
for(int a : arr){
int r = mat_map[a] / mat.front().size();
int c = mat_map[a] % mat.front().size();
if(++ raw[r] == mat.front().size()){
break;
}
if(++ column[c] == mat.size()){
break;
}
ans ++;
}
return ans;
}
};