题目链接:https://leetcode.com/problems/missing-number/
解法1)根据不缺失情况下的数字和-缺失情况下的数字和就是缺失的数字,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int sum = 0; for(int i=0; i<n; ++i) { sum += nums[i]; } int total = 0; for(int i=0; i<=n; ++i) { total += i; } return total - sum; } };
解法2)使用异或来解决,首先1~n先进行一次异或,然后对数组中的数字再异或一次,由于a^a得到的是0,因此有一个数字在异或过程中无法消除,该数字即为缺失的数字,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int res = 0; for(int i=0; i<=n; ++i) { if(i != n) { res ^= nums[i]; } res ^= i; } return res; } };
解法3)使用二分搜索,但是本题的要求是O(n)的时间复杂度,不符合要求,但是如果数组已经是有序的,则二分搜索将成为最好的算法,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); int l = 0; int r = nums.size() - 1; while(l < r) { int m = l + ((r - l) >> 1); if(nums[m] == m) { l = m + 1; } else { r = m - 1; } } int res = l == nums[l] ? l + 1 : l; // 如果是l == nums[l] 说明缺少的是最后一个数字 return res; } };