Day04:每日一题:2661. 找出叠涂元素

2661. 找出叠涂元素

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

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

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

Day04:每日一题:2661. 找出叠涂元素_第1张图片

这题题意讲的有点不清楚, 其实就是按照数组下标一个一个遍历,由于mat的值不重复,所以每次只能涂一个,直到一行或者一列涂满为止。

思路就是用一个HashMap存mat中对应的值和其下标(数对二维数组),然后创建两个数组rowCnt和colCnt记录每一行/列的涂色数量,等于总列数/总行数时即涂满返回对应下标:

class Solution {
    public int firstCompleteIndex(int[] arr, int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        Map<Integer, int[]> pos = new HashMap<Integer,int []>();
        for(int i = 0; i < m; i++){
            for (int j = 0; j < n; j++) {
                pos.put(mat[i][j], new int[]{i,j});
            }
        }
        //用rowCnt记录每一行被涂色的数目,colCnt同理;
        int[] rowCnt = new int[m];
        int[] colCnt = new int[n];
        //若有一行/列的数目等于m/n说明涂满了返回arr[i】
        for (int i = 0; i < arr.length; i++) {
            int row = pos.get(arr[i])[0];
            int col = pos.get(arr[i])[1];
            rowCnt[row]++;
            colCnt[col]++;
            if(rowCnt[row] == n){
                return i;
            }
            if(colCnt[col] == m){
                return i;
            }
        }


        return 0;
    }
}

几点注意事项:

  • 二维数组行数m = mat.length, n = mat[0].length

  • 定义value为数组的hashmap:

    Map<Integer, int[]> pos = new HashMap<Integer,int []>();
    
  • 插入hashMap:pos.put 没有s!!!

  • 查找hashMap: pos.get(key)

  • 这里不用在循环中找rowCnt是否满足条件,因为是一个加的过程,最先察觉到满足的肯定是自己的这一循环过程。

你可能感兴趣的:(java,数据结构)