0
点赞
收藏
分享

微信扫一扫

【数据结构】堆(C语言)

悄然丝语 2023-12-03 阅读 40

【LetMeFly】2661.找出叠涂元素:多次映射

力扣题目链接:https://leetcode.cn/problems/first-completely-painted-row-or-column/

给你一个下标从 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] 在矩阵中的第二列上都被涂色。

 

提示:

  • 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 中的所有整数 互不相同

方法一:多次映射

思路:

遍历arr数组,将arr[now]映射到mat中的i行j列,并将i行中被命中的次数+1,j列中被命中的次数加一。

首次i行全部命中或j列全部命中则返回arr中当前下标now。

具体方法:

怎么快速将 a r r [ n o w ] arr[now] arr[now]快速映射到mat中的i行j列呢?可以使用一个“哈希表”:

怎么记录某行或某列的命中次数呢?

  • 时间复杂度 O ( l e n ( a r r ) ) O(len(arr)) O(len(arr)),因为 l e n ( a r r ) = s i z e ( m a t ) len(arr) = size(mat) len(arr)=size(mat)
  • 空间复杂度 O ( l e n ( a r r ) ) O(len(arr)) O(len(arr))

AC代码

C++
class Solution {
public:
    int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& mat) {
        int n = mat.size(), m = mat[0].size();
        vector<pair<int, int>> a(m * n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                a[mat[i][j] - 1] = {i, j};
            }
        }
        vector<int> cntRow(n), cntCol(m);
        for (int i = 0; i < arr.size(); i++) {
            int t = arr[i] - 1;
            cntRow[a[t].first]++;
            cntCol[a[t].second]++;
            if (cntRow[a[t].first] == m || cntCol[a[t].second] == n) {
                return i;
            }
        }
        return -1;  // Fake Return
    }
};
Python
# from typing import List

class Solution:
    def firstCompleteIndex(self, arr: List[int], mat: List[List[int]]) -> int:
        n, m = len(mat), len(mat[0])
        a = [[] for _ in range(n * m)]
        for i in range(n):
            for j in range(m):
                a[mat[i][j] - 1] = [i, j]
        rowCnt, colCnt = [0] * n, [0] * m
        for i in range(len(arr)):
            t = arr[i] - 1
            rowCnt[a[t][0]] += 1
            colCnt[a[t][1]] += 1
            if rowCnt[a[t][0]] == m or colCnt[a[t][1]] == n:
                return i
        return -1  # Fake Return
举报

相关推荐

数据结构—堆(C语言实现)

数据结构——堆

数据结构--堆

数据结构-堆

数据结构:堆

【数据结构】堆

0 条评论