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

题目

找出二维整数矩阵中的重复数字和缺失数字

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

任务

找出重复的数字 a 和缺失的数字 b。返回一个下标从 0 开始、长度为 2 的整数数组 ans,其中 ans[0] 等于 aans[1] 等于 b

示例

示例 1

输入:

grid = [[1, 3], [2, 2]]

输出:

[2, 4]

解释: 数字 2 重复,数字 4 缺失,所以答案是 [2, 4]

示例 2

输入:

grid = [[9, 1, 7], [8, 9, 2], [3, 4, 6]]

输出:

[9, 5]

解释: 数字 9 重复,数字 5 缺失,所以答案是 [9, 5]

提示

  • 2 <= n == grid.length == grid[i].length <= 50
  • 1 <= grid[i][j] <= n^2
  • 对于所有满足 1 <= x <= n^2x,恰好存在一个 x 与矩阵中的任何成员都不相等。
  • 对于所有满足 1 <= x <= n^2x,恰好存在一个 x 与矩阵中的两个成员相等。
  • 除上述的两个之外,对于所有满足 1 <= x <= n^2x,都恰好存在一对 i, j 满足 0 <= i, j <= n - 1grid[i][j] == x

思路

简单题,用数组下标做标记,数值记录出现次数即可,空间换时间。

代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* findMissingAndRepeatedValues(int** grid, int gridSize, int* gridColSize, int* returnSize) {
    int* nums = (int*)malloc(sizeof(int) * (gridSize * gridSize + 1));
    int* lostandrep = (int*)malloc(sizeof(int) * 2);
    (*returnSize) = 2;
    memset(nums, 0, sizeof(int) * (gridSize * gridSize + 1));
    nums[0] = 1;
    
    // 统计每个数字出现的次数
    for (int i = 0; i < gridSize; i++) {
        for (int j = 0; j < (*gridColSize); j++) {
            nums[grid[i][j]]++;
        }
    }
    
    // 找出重复的数字 a 和缺失的数字 b
    for (int i = 0; i < (gridSize * (*gridColSize)) + 1; i++) {
        if (nums[i] == 2) {
            lostandrep[0] = i;
        } else if (nums[i] == 0) {
            lostandrep[1] = i;
        }
    }
    
    if (lostandrep[1] == 0) {
        lostandrep[1] = gridSize * gridSize;
    }
    
    return lostandrep;
}

复杂度分析

  • 时间复杂度O(n^2),其中 n 是矩阵的维度。遍历整个矩阵需要 O(n^2) 的时间,统计数字出现的次数也需要 O(n^2) 的时间。
  • 空间复杂度O(n^2),主要用于存储数字出现次数的数组 nums 和返回结果数组 lostandrep

该方法通过一次遍历矩阵统计数字的出现次数,然后再次遍历次数数组找到重复和缺失的数字,从而高效地解决了问题。

## 结果
![结果图](https://img-blog.csdnimg.cn/direct/9f39757599654ea6bc6bad59f0e92d7a.png)




  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值