2661. 找出叠涂元素
给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。
arr 和 mat 都包含范围 [1,m * n] 内的 所有 整数。
从下标 0 开始遍历 arr 中的每个下标 i ,并将包含整数 arr[i] 的 mat 单元格涂色。
请你找出 arr 中在 mat 的某一行或某一列上都被涂色且下标最小的元素,并返回其下标 i 。
这题题意讲的有点不清楚, 其实就是按照数组下标一个一个遍历,由于mat的值不重复,所以每次只能涂一个,直到一行或者一列涂满为止。
思路就是用一个HashMap存mat中对应的值和其下标(数对二维数组),然后创建两个数组rowCnt和colCnt记录每一行/列的涂色数量,等于总列数/总行数时即涂满返回对应下标:
class Solution {
public int firstCompleteIndex(int[] arr, int[][] mat) {
int m = mat.length;
int n = mat[0].length;
Map<Integer, int[]> pos = new HashMap<Integer,int []>();
for(int i = 0; i < m; i++){
for (int j = 0; j < n; j++) {
pos.put(mat[i][j], new int[]{i,j});
}
}
//用rowCnt记录每一行被涂色的数目,colCnt同理;
int[] rowCnt = new int[m];
int[] colCnt = new int[n];
//若有一行/列的数目等于m/n说明涂满了返回arr[i】
for (int i = 0; i < arr.length; i++) {
int row = pos.get(arr[i])[0];
int col = pos.get(arr[i])[1];
rowCnt[row]++;
colCnt[col]++;
if(rowCnt[row] == n){
return i;
}
if(colCnt[col] == m){
return i;
}
}
return 0;
}
}
几点注意事项:
-
二维数组行数
m = mat.length, n = mat[0].length
-
定义value为数组的hashmap:
Map<Integer, int[]> pos = new HashMap<Integer,int []>();
-
插入hashMap:
pos.put
没有s!!! -
查找hashMap: pos.get(key)
-
这里不用在循环中找rowCnt是否满足条件,因为是一个加的过程,最先察觉到满足的肯定是自己的这一循环过程。