题目
找出二维整数矩阵中的重复数字和缺失数字
给你一个下标从 0 开始的二维整数矩阵 grid
,大小为 n * n
,其中的值在 [1, n^2]
范围内。除了某个数字 a
出现两次,某个数字 b
缺失之外,每个整数都恰好出现一次。
任务
找出重复的数字 a
和缺失的数字 b
。返回一个下标从 0 开始、长度为 2 的整数数组 ans
,其中 ans[0]
等于 a
,ans[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^2
的x
,恰好存在一个x
与矩阵中的任何成员都不相等。 - 对于所有满足
1 <= x <= n^2
的x
,恰好存在一个x
与矩阵中的两个成员相等。 - 除上述的两个之外,对于所有满足
1 <= x <= n^2
的x
,都恰好存在一对i, j
满足0 <= i, j <= n - 1
且grid[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)