2965. 找出缺失和重复的数字

77 阅读1分钟

题目

给你一个下标从 0 开始的二维整数矩阵 grid,大小为 n * n ,其中的值在 [1, n2] 范围内。除了 a 出现 两次b 缺失 之外,每个整数都 恰好出现一次 。

任务是找出重复的数字a 和缺失的数字 b 。

返回一个下标从 0 开始、长度为 2 的整数数组 ans ,其中 ans[0] 等于 a ,ans[1] 等于 b 。

思路

结果需要获取到出现了两次以及没有出现的数字

一开始打算使用一个数组来存储数字出现的次数,发现只有一个数组的话获取没有出现的数字还需要再次遍历数组来判断哪个数字的出现次数为 0

之后,定义一个 sum 变量来存储所有的值的和, 这样在用双指针遍历完矩阵后结果也就出来了

看了题解后发现,感觉还不如直接暴力呢 T_T

代码

class Solution {
    public int[] findMissingAndRepeatedValues(int[][] grid) {
        int n = grid.length;
        //定义一个总值用来判断最后缺少的数字
        int sum = 0;
        for (int i = 1; i <= n * n; i++) {
            sum += i;
        }
        //用数组判断是否出现重复的数字
        int[] arr = new int[n * n + 1];

        int[] ans = new int[2];
        for (int[] ints : grid) {
            int left = 0;
            int right = n - 1;
            while (left <= right) {
                int leftNum = ints[left];
                int rightNum = ints[right];
                if (left != right) {
                    arr[leftNum] += 1;
                    int leftCount = arr[leftNum];
                    sum -= leftNum;
                    if (leftCount == 2) {
                        ans[0] = leftNum;
                    }
                }
                arr[rightNum] += 1;
                int rightCount = arr[rightNum];
                if (rightCount == 2) {
                    ans[0] = rightNum;
                }
                sum -= rightNum;
                left++;
                right--;
            }
        }
        sum += ans[0];
        ans[1] = sum;
        return ans;
    }
}

题解

灵神题解: leetcode.cn/problems/fi…