🚀 算法题 🚀 |
🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯
🚀 算法题 🚀 |
🚩 题目链接
⛲ 题目描述
给你一个下标从 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 中的所有整数 互不相同
🌟 求解思路&实现代码&运行结果
⚡ 计数 + Hash表
🥦 求解思路
- 因为题目让我们找到从arr数组中按顺序选择数字来填充mat二维数组,找到使得mat数组中某一行或者某一列被填充好,此时arr的最小下标位置。
- 首先,我们可以通过hashmap来统计mat数组中的元素以及对应的下标位置。
- 然后遍历arr数组,此时要维护一个行和列计数的数组,通过此时arr返回的元素下标,在对应的行和列上进行填充,如果某一行或者某一列的元素都被填满,直接返回, 返回arr中最小的下标即可。
- 实现代码如下所示:
🥦 实现代码
class Solution {
public int firstCompleteIndex(int[] arr, int[][] mat) {
int m=mat.length,n=mat[0].length;
int[] row=new int[m];
int[] col=new int[n];
HashMap<Integer,int[]> map=new HashMap<>();
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
map.put(mat[i][j],new int[]{i,j});
}
}
for(int i=0;i<arr.length;i++){
int[] nums=map.get(arr[i]);
int a=nums[0],b=nums[1];
row[a]++;
col[b]++;
if(row[a]==n||col[b]==m){
return i;
}
}
return -1;
}
}
🥦 运行结果
💬 共勉
最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉! |