当前位置: 首页 > article >正文

Leetcode2661. 找出叠涂元素

Every day a Leetcode

题目来源:2661. 找出叠涂元素

解法1:哈希

题目很绕,理解题意后就很简单。

由于矩阵 mat 中每一个元素都不同,并且都在数组 arr 中,所以首先我们用一个哈希表 hash 来存储 mat 中每一个元素的位置信息(即行列信息)。然后用一个长度为 m 的数组来表示每一行中已经被涂色的个数,用一个长度为 n 的数组来表示每一列中已经被涂色的个数。其中若出现某一行 i 出现 rowsCount[i]=n 或者某一列 j 出现 colsCount[j]=m,则表示第 i 行或者第 j 列都被涂色。

算法:

  1. 特判。
  2. mat 的行数为 m,列数为 n。
  3. 建立一个哈希表 unordered_map<int, pair<int, int>> hash,其中 keymat 中整数值,value 是一个 pair<int, int>,存储的是 matkey 值的横坐标、纵坐标。
  4. 遍历 mat,其中 key = mat[i][j]pair<int, int> value(i, j),插入哈希表 hash 中。
  5. 用一个长度为 m 的数组 rowsCount 来表示每一行中已经被涂色的个数,用一个长度为 n 的数组 colsCount 来表示每一列中已经被涂色的个数
  6. 遍历数组 arr,设下标为 i,找到 arr[i]mat 中的横纵坐标:row = hash[arr[i]].firstcol = hash[arr[i]].second,计数数组对应的行列自增 1,如果发现 rowsCount[row] = n,说明第 row 行的 n 个单元格都被涂上色,返回此时的下标 i;同理,如果发现 colsCount[col] = m,说明第 col 列的 m 个单元格都被涂上色,返回此时的下标 i

代码:

/*
 * @lc app=leetcode.cn id=2661 lang=cpp
 *
 * [2661] 找出叠涂元素
 */

// @lc code=start
class Solution
{
public:
    int firstCompleteIndex(vector<int> &arr, vector<vector<int>> &mat)
    {
        if (arr.empty() || mat.empty())
            return -1;
        int m = mat.size(), n = m ? mat[0].size() : 0;
        unordered_map<int, pair<int, int>> hash; // <整数,pair<横坐标,纵坐标>>
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                int key = mat[i][j];
                pair<int, int> value(i, j);
                hash[key] = value;
            }
        vector<int> rowsCount(m, 0), colsCount(n, 0);
        for (int i = 0; i < arr.size(); i++)
        {
            int row = hash[arr[i]].first, col = hash[arr[i]].second;
            rowsCount[row]++;
            if (rowsCount[row] == n)
                return i;
            colsCount[col]++;
            if (colsCount[col] == m)
                return i;
        }
        return -1;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(m*n),其中 m 和 n 分别是二维数组 mat 的行数和列数。主要为用哈希表存储矩阵 mat 中每一个元素对应行列序号的时间开销。

空间复杂度:O(m*n),其中 m 和 n 分别是二维数组 mat 的行数和列数。主要为用哈希表存储矩阵 mat 中每一个元素对应行列序号的空间开销。


http://www.kler.cn/a/156196.html

相关文章:

  • Ruby编程语言全景解析:从基础到进阶
  • c++写一个死锁并且自己解锁
  • QQ 小程序已发布,但无法被搜索的解决方案
  • 基于Java Web的传智播客crm企业管理系统的设计与实现
  • 1111111111待修改--大流量分析(三)-BUUCTF
  • HAproxy 详解
  • Android Audio实战——音频属性设置(二十二)
  • 根据关键词写作文章的软件,根据标题写作文章的工具
  • 【无标题】parseq
  • 高校人员信息管理系统C++
  • 通义灵码简单使用例子
  • MATLAB算法实战应用案例精讲-【图像处理】人脸识别(补充篇)
  • 手持机|三防智能手机_4寸/5寸/6寸安卓系统三防手机PDA手持终端方案
  • 保存防火墙的规则和自定义链
  • 【Vulnhub 靶场】【Momentum: 2】【简单】【20210628】
  • 基于PHP的在线日语学习平台
  • Python---函数递归---练习:使用递归求N的阶乘(如n=100)(本文以递归算法 解法为主)
  • 领域驱动架构(DDD)建模
  • Rstudio-server无法登陆?几种解决方法 卡死 崩溃了
  • 基本面选股的方法
  • 基于Java SSM框架实现美好生活九宫格日志网站系统项目【项目源码+论文说明】计算机毕业设计
  • Java内存缓存神器:Caffeine(咖啡因)
  • qt-C++笔记之addItem(), addWidget(), addLayout()
  • Kettle 安装配置
  • 关于随机数的设定和随机噪声
  • SQLserver通过字符串中间截取然后分组