列表

详情


2661. 找出叠涂元素

给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 matarrmat 都包含范围 [1,m * n] 内的 所有 整数。

从下标 0 开始遍历 arr 中的每个下标 i ,并将包含整数 arr[i]mat 单元格涂色。

请你找出 arr 中在 mat 的某一行或某一列上都被涂色且下标最小的元素,并返回其下标 i

 

示例 1:

image explanation for example 1
输入:arr = [1,3,4,2], mat = [[1,4],[2,3]]
输出:2
解释:遍历如上图所示,arr[2] 在矩阵中的第一行或第二列上都被涂色。

示例 2:

image explanation for example 2
输入:arr = [2,8,7,4,1,3,5,6,9], mat = [[3,2,5],[1,4,6],[8,7,9]]
输出:3
解释:遍历如上图所示,arr[3] 在矩阵中的第二列上都被涂色。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& 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

上一题