leetcode 645 题解

题目

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复

给定一个数组 nums 代表了集合 S 发生错误后的结果。

请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]

示例 2:
输入:nums = [1,1]
输出:[1,2]

提示:
2 <= nums.length <= $10^4$
1 <= nums[i] <= $10^4$

思路

暴力解法

因为整数是从1到n的,而我们有 $1 <= \text{nums[i]} <= 10^4$ ,所以我们可以用一个数组记录每个数的出现情况,当某个数出现0次和某个数出现2次的时候,我们就可以找到题目要求的数字。时间复杂度为 O(n) 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
vector<int> result;
int count[10005] = {0}, maximun = 0, a = 0, b = 0;
for (int i = 0; i < nums.size(); i++) {
count[nums[i]]++;
maximun = max(maximun, nums[i]);
}
for (int i = 1; i <= nums.size(); i++) {
if (count[i] == 0)
a = i;
if (count[i] == 2)
b = i;
}
result.push_back(b);
result.push_back(a);
return result;
}
};