⭐️面试题 17.04. 消失的数字
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:输入:[3,0,1]输出:2
示例 2:输入:[9,6,4,2,3,5,7,0,1]输出:8
思路
💩暴力解法
能靠暴力解决还要动什么脑子: 呢。两层for循环走起来,把每个数都遍历一遍看有没有。
这样做在力扣上能过,但耗时太长。
时间复杂度 O ( n 2 ) O(n^2) O(n2)
空间复杂度 O ( 1 ) O(1) O(1)
C++代码如下
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i, j;
for (i = 0; i <= nums.size(); i++) {
for (j = 0; j < nums.size(); j++) {
if (i == nums[j]) {
break;
}
}
if (j == nums.size()) {
return i;
}
}
return 0;
}
};
✨排序
排序后从前往后遍历,看数值和下标是否相等。遍历到最后一个没有发现不相等的说明缺失的就是n
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i;
sort(nums.begin(), nums.end());
for (i = 0; i < nums.size(); i++) {
if (nums[i] != i) {
return i;
}
}
return nums.size();
}
};
时间复杂度 O ( n log n ) O(n\log n) O(nlogn),如果使用自己写的冒泡排序就是 O ( n 2 ) O(n^2) O(n2)
空间复杂度 O ( 1 ) O(1) O(1)
⭐️哈希法
创建一个比原数组大一个元素的数组,并初始化。把原数组中出现的数字映射为record数组的下标,对应的值记为1。最好只要遍历数组,值为0的下标就是缺失的数字。
class Solution {
public:
int missingNumber(vector<int>& nums) {
vector<int> record(nums.size() + 1);
for (int i = 0; i < nums.size(); i++) {
record[nums[i]] = 1;
}
for (int i = 0; i < nums.size() + 1; i++) {
if (record[i] == 0) {
return i;
}
}
return 0;
}
};
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)
⭐️数学
直接用等差数列求和公式 n ( n + 1 ) 2 \frac{n(n+1)}2 2n(n+1)减去数组中所有元素。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
return ((1 + nums.size()) * nums.size() >> 1) - sum;
}
};
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
⭐️异或
a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
二进制位相同为0,不同为1
异或支持的运算律:
- 归零律:a ^ a = 0
- 恒等律:a ^ 0 = a
- 交换律:a ^ b = b ^ a
- 结合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
- 自反:a ^ b ^ a = b
只要创建一个result = 0
,把数组内所有值和0 ~ n都与它异或,最终结果就是缺失的数字。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int result = 0;
for (int i = 0; i < nums.size(); i++) {
result ^= nums[i] ^ i;
}
result ^= nums.size();
return result;
}
};
时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( 1 ) O(1) O(1)
题目不难方法却不少,平时也要多锻炼一题多解的能力😜
类似题: