題目
給定一個包含 0, 1, 2, ..., n
中 n 個數的序列,找出 0 .. n 中沒有出現在序列中的那個數。
來源:https://leetcode-cn.com/problems/missing-number/
示例 1:
輸入: [3,0,1]
輸出: 2
示例 2:
輸入: [9,6,4,2,3,5,7,0,1]
輸出: 8
額外要求:
你的算法應具有線性時間複雜度。你能否僅使用額外常數空間來實現?
解答
方法一:
在不考慮線性時間複雜度的前提下,使用排序,然後查找的方法可以解決。我也就能想到這方法,後邊的方法二和方法三
實在是想不到,太巧妙了。
class Solution {
public:
int missingNumber(vector<int>& nums) {
std::sort(nums.begin(), nums.end());
if (nums.front() != 0) {
return 0;
}
if (nums.back() != nums.size() ) {
return nums.size();
}
for (int i = 0; i < nums.size() - 1; ++i) {
if (nums[i] + 1 != nums[i + 1]) {
return nums[i] + 1;
}
}
return 0;
}
};
方法二:
思路是:
- 求0-n和然後減去數組的和就是答案
- 防止溢出,可以在加的同時進行減操作
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum = 0;
/// 最大的數字爲 nums.size()
/// 把 0 到 nums.size() + 1全部加一起來
for (int i = 0; i < nums.size(); i++) {
sum = sum + i - nums[i];
}
sum += nums.size();
return sum;
}
};
方法三:
異或法,
- 相同的數異或操作之後是0
- 異或操作之後最終結果就是缺失的那個數字
class Solution {
public:
int missingNumber(vector<int>& nums) {
///用異或抵消
int res = 0;
for (int i = 0; i < nums.size(); ++i) {
res ^= nums[i];
res ^= i;
}
res ^= nums.size();
return res;
}
};