mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
Create 268. Missing Number.md
This commit is contained in:
parent
a846a2bc4c
commit
82d57d85b5
52
268. Missing Number.md
Normal file
52
268. Missing Number.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# [268. Missing Number](https://leetcode.com/problems/missing-number/description/)
|
||||||
|
# 思路
|
||||||
|
## 思路一
|
||||||
|
先将数组进行排序,然后从前往后遍历,若某元素与其下标不等,说明缺失了下标这个数。
|
||||||
|
时间复杂度O(nlogn)
|
||||||
|
## 思路二
|
||||||
|
因为没有缺失的数组的和是很容易知道的,用这个和减去实际和就是缺失值。
|
||||||
|
想知道没有缺失的数组的和,先应该找出数组的最大值max_num,若最大值为size-1,则缺失的就是size这个值,直接返回即可。
|
||||||
|
否则缺失值就为 `result = (max_num + 1)*max_num/2 - sum `。
|
||||||
|
注意上式子第一项很容易存在溢出,所以将上式子拆成 `2*result = ∑(max_num + 1 - 2 * nums[i])`, 这样就不容易溢出了。
|
||||||
|
时间复杂度O(n), 空间复杂度O(1)
|
||||||
|
## 思路三
|
||||||
|
使用一个例子来看一下算法的运算过程:
|
||||||
|
nums: 0 1 2 4 5 6 7 (缺失3)
|
||||||
|
index: 0 1 2 3 4 5 6
|
||||||
|
可见如果再加上一个nums.size()和缺失值的话,所有的数字都是成对的,对这些数字进行异或操作会最终会得0。
|
||||||
|
所以如果不加缺失值,异或得到的结果就是缺失值。
|
||||||
|
此算法就肯定不会溢出了, 时间复杂度O(n), 空间复杂度O(1)
|
||||||
|
# C++
|
||||||
|
## 思路二
|
||||||
|
```
|
||||||
|
class Solution {
|
||||||
|
public:
|
||||||
|
int missingNumber(vector<int>& nums) {
|
||||||
|
int max_num = -1;
|
||||||
|
for(int num: nums)
|
||||||
|
if(max_num < num) max_num = num;
|
||||||
|
|
||||||
|
if(max_num == nums.size() - 1)
|
||||||
|
return nums.size();
|
||||||
|
|
||||||
|
int result_2 = 0;
|
||||||
|
for(int num: nums)
|
||||||
|
result_2 += (max_num + 1 - 2 * num);
|
||||||
|
|
||||||
|
return result_2 / 2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
## 思路三
|
||||||
|
```
|
||||||
|
class Solution {
|
||||||
|
public:
|
||||||
|
int missingNumber(vector<int>& nums) {
|
||||||
|
int result = 0, i = 0;
|
||||||
|
for (i = 0; i < nums.size(); i++) {
|
||||||
|
result = result ^ i ^ nums[i];
|
||||||
|
}
|
||||||
|
return result ^ nums.size();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user