【数据结构和算法】找出叠涂元素

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

三、代码

四、复杂度分析


前言

这是力扣的2661题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。


一、题目描述

给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。arr 和 mat 都包含范围 [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 中的所有整数 互不相同

二、题解

这道题其实是常规哈希表的运用,本题也将用 HashMap 来借题。

算法:

  • 因为 mat 的值各不相同,将用HashMap来存储,以mat[i][j]也就是值为键,[i,j]也就是坐标为值,方便后续快速查询某个值所在位置。
  • 然后创建数组 c1 和 c2 ,分别用来记录某行某列有多少单元格被涂色,如 c1[x] = a 代表第 x 行被涂色单元格数量为 a 个,c2[y] = b 代表第 y 列被涂色单元格数量为 b 个。
  • 接着遍历所有的 arr[i] ,查询到 arr[i] 的所在位置 info 后,更新 c1 和 c2,若某行或某列被完全涂色,返回当前下标。

注意题目的意思是:返回刚好涂完一列或一行的时候的最小数字下标。


三、代码

Java版本:

class Solution {public int firstCompleteIndex(int[] arr, int[][] mat) {int n = mat.length, m = mat[0].length;HashMap<Integer, int[]> map = new HashMap<>();for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {map.put(mat[i][j], new int[]{i, j});//mat[i][j]性质等于arr[i]}}int[] c1 = new int[n], c2 = new int[m];//c1记录某行单元格涂色情况,c1记录某列单元格涂色情况for (int i = 0; i < n * m; i++) {int[] info = map.get(arr[i]);//info[0]是行坐标,[info[1]]是列坐标if (++c1[info[0]] == m || ++c2[info[1]] == n) {return i;//第一个叠涂完成的一定是最小的元素}}return -1;}
}

C++版本:

class Solution {
public:int firstCompleteIndex(vector<int>& arr, vector<vector<int>>& mat) {int n = mat.size(), m = mat[0].size();unordered_map<int, pair<int, int>> map;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {map[mat[i][j]] = make_pair(i, j);}}vector<int> c1(n), c2(m);for (int i = 0; i < n * m; i++) {pair<int, int> info = map[arr[i]];if (++c1[info.first] == m || ++c2[info.secon] == n) return i;}return -1; // never}
};

 Python版本:

class Solution:def firstCompleteIndex(self, arr: List[int], mat: List[List[int]]) -> int:n, m = len(mat), len(mat[0])mapping = {mat[i][j]: (i, j) for i in range(n) for j in range(m)}c1, c2 = [0] * n, [0] * mfor i in range(n * m):x, y = mapping[arr[i]]c1[x], c2[y] = c1[x] + 1, c2[y] + 1if c1[x] == m or c2[y] == n: return ireturn -1  # never

四、复杂度分析

  • 时间复杂度:O(n×m)
  • 空间复杂度:O(n×m)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238649.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element中el-table表头通过header-row-style设置样式

文章目录 一、知识点二、设置全部表头2.1、方式一2.2、方式二 三、设置某个表头四、最后 一、知识点 有些时候需要给element-ui表头设置不同样式&#xff0c;比如居中、背景色、字体大小等等&#xff0c;这时就可以用到本文要说的属性header-row-style。官网说明如下所示&…

量子光学的进步:光子学的“下一件小事”

量子光学是量子力学和光学交叉领域中发展迅速的一门学科&#xff0c;探索光的基本特性及其与物质在量子水平上的相互作用。通过利用光的独特特性&#xff0c;量子光学为通信、计算、密码学和传感等各个学科的变革性进步铺平了道路。 如今&#xff0c;量子光学领域的研究人员和工…

基于springboot 图书馆管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Inference with C# BERT NLP Deep Learning and ONNX Runtime

目录 效果 测试一 测试二 测试三 模型信息 项目 代码 下载 Inference with C# BERT NLP Deep Learning and ONNX Runtime 效果 测试一 Context &#xff1a;Bob is walking through the woods collecting blueberries and strawberries to make a pie. Question …

前端入门(五)Vue3组合式API特性

文章目录 Vue3简介创建Vue3工程使用vite创建vue-cli方式 常用 Composition API启动项 - setup()setup的执行时机与参数 响应式原理vue2中的响应式vue3中的响应式ref函数reactive函数reactive与ref对比 计算属性 - computed监视属性 - watchwatchEffect Vue3生命周期自定义hook函…

2012-2021年银行数字化转型程度数据(根据年报词频计算)

2012-2021年银行数字化转型程度&#xff08;根据年报词频计算&#xff09; 1、时间&#xff1a;2012-2021年 2、指标&#xff1a;银行名称、年份、数字化转型程度 3、范围&#xff1a;52家银行&#xff08;上海银行、中信银行、中国银行、交通银行、光大银行、兰州银行、兴业…

9.整数转换为布尔值【2023.12.1】

1.问题描述 整数转换为布尔值。 2.解决思路 输入一个整数。 输出布尔值并输出。 3.代码实现 numint(input("请输入一个数字")) boolnumbool(num) print(boolnum)4.运行结果

力扣232-用栈实现队列

文章目录 力扣232-用栈实现队列示例代码实现总结收获 力扣232-用栈实现队列 示例 代码实现 class MyQueue {Deque<Integer> instack;Deque<Integer> outstack ;public MyQueue() {instacknew ArrayDeque<Integer>();outstacknew ArrayDeque<Integer>(…

Mapper文件夹在resource目录下但是网页报错找不到productMapper.xml文件的解决

报错如下&#xff1a; 我的Mapper文件夹在resourse目录下但是网页报错找不到productMapper.xml。 结构如下&#xff1a;代码如下&#xff1a;<mappers><mapper resource"com/dhu/mapper/productMapper.xml" /> </mappers> 这段代码是在mybatis-co…

深入理解前端路由:构建现代 Web 应用的基石(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

IDEA:官方汉化包

CtrlAlts进入setting找到Plugins&#xff0c;直接在如下的搜索框中输入chinese回车 之后就是这样的啦~

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…