class Solution {
public:
int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& mat) {
}
};
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
中的所有整数 互不相同原站题解
java 解法, 执行用时: 24 ms, 内存消耗: 60.9 MB, 提交时间: 2023-12-01 07:43:22
class Solution { public int firstCompleteIndex(int[] arr, int[][] mat) { int n = mat.length; int m = mat[0].length; Map<Integer, int[]> map = new HashMap<Integer, int[]>(); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { map.put(mat[i][j], new int[]{i, j}); } } int[] rowCnt = new int[n]; int[] colCnt = new int[m]; for (int i = 0; i < arr.length; ++i) { int[] v = map.get(arr[i]); ++rowCnt[v[0]]; if (rowCnt[v[0]] == m) { return i; } ++colCnt[v[1]]; if (colCnt[v[1]] == n) { return i; } } return -1; } }
cpp 解法, 执行用时: 304 ms, 内存消耗: 160.8 MB, 提交时间: 2023-12-01 07:42:15
class Solution { public: int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& mat) { unordered_map<int, pair<int, int>> hash; int m = mat.size(), n = mat[0].size(); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) hash[mat[i][j]] = {i ,j}; } vector<int> row(m), col(n); for (int i = 0; i < arr.size(); ++i) { auto it = hash[arr[i]]; ++row[it.first], ++col[it.second]; if (row[it.first] == n || col[it.second] == m) return i; } return -1; } };
golang 解法, 执行用时: 156 ms, 内存消耗: 12.6 MB, 提交时间: 2023-05-05 15:59:06
func firstCompleteIndex(arr []int, mat [][]int) int { m, n := len(mat), len(mat[0]) type pair struct{ r, c int } pos := make([]pair, m*n+1) for i, row := range mat { for j, x := range row { pos[x] = pair{i, j} } } rowCnt := make([]int, m) colCnt := make([]int, n) for i, x := range arr { p := pos[x] rowCnt[p.r]++ colCnt[p.c]++ if rowCnt[p.r] == n || colCnt[p.c] == m { return i } } return -1 }
python3 解法, 执行用时: 184 ms, 内存消耗: 41.9 MB, 提交时间: 2023-05-05 15:58:53
''' 首先遍历 mat,用一个 pos 数组记录 mat[i][j] 在 mat 中位置。 然后遍历 arr[i],同时用两个数组 rowCnt 和 colCnt 记录每行每列的涂色个数。 如果出现某一行或某一列上都被涂色的情况,就返回 1。 ''' class Solution: def firstCompleteIndex(self, arr: List[int], mat: List[List[int]]) -> int: m, n = len(mat), len(mat[0]) pos = [0] * (m * n + 1) for i, row in enumerate(mat): for j, x in enumerate(row): pos[x] = (i, j) row_cnt = [0] * m col_cnt = [0] * n for i, x in enumerate(arr): r, c = pos[x] row_cnt[r] += 1 col_cnt[c] += 1 if row_cnt[r] == n or col_cnt[c] == m: return i