目录
2661. 找出叠涂元素
题目描述:
给你一个下标从 0 开始的整数数组 arr
和一个 m x n
的整数 矩阵 mat
。arr
和 mat
都包含范围 [1,m * n]
内的 所有 整数。
从下标 0
开始遍历 arr
中的每个下标 i
,并将包含整数 arr[i]
的 mat
单元格涂色。
请你找出 arr
中在 mat
的某一行或某一列上都被涂色且下标最小的元素,并返回其下标 i
。
示例 1:
输入:arr = [1,3,4,2], mat = [[1,4],[2,3]] 输出:2 解释:遍历如上图所示,arr[2] 在矩阵中的第一行或第二列上都被涂色。
示例 2:
输入:arr = [2,8,7,4,1,3,5,6,9], mat = [[3,2,5],[1,4,6],[8,7,9]] 输出:3 解释:遍历如上图所示,arr[3] 在矩阵中的第二列上都被涂色。
提示:
m == mat.length
n = mat[i].length
arr.length == m * n
1 <= m, n <= 105
1 <= m * n <= 105
1 <= arr[i], mat[r][c] <= m * n
arr
中的所有整数 互不相同mat
中的所有整数 互不相同
实现代码与解析:
Hash
C++
class Solution {
public:
int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& mat) {
int m = mat.size();
int n = mat[0].size();
vector<pair<int, int>> hash(n * m + 1);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
hash[mat[i][j]] = {i, j};
}
}
vector<int> r(m, 0);
vector<int> c(n, 0);
for (int i = 0; i < arr.size(); i++) {
pair<int, int> tmp = hash[arr[i]];
if (++r[tmp.first] == n) return i;
if (++c[tmp.second] == m) return i;
}
return -1;
}
};
Java
class Solution {
public int firstCompleteIndex(int[] arr, int[][] mat) {
int m = mat.length;
int n = mat[0].length;
Map<Integer, int[]> map = new HashMap<Integer, int[]>();
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
map.put(mat[i][j], new int[]{i, j});
}
}
int[] row = new int[m];
int[] col = new int[n];
for (int i = 0; i < arr.length; i++) {
int[] t = map.get(arr[i]);
if (++row[t[0]] == n || ++col[t[1]] == m) return i;
}
return -1;
}
}
原理思路:
hash记录矩阵中的值与其对应位置。row,col数组记录,每一行或列的数量。
遍历arr数组,对相应行和列加一,某一行或者某一列先满,得到答案i。