您的位置:首页 > 其它

Missing Number 三种解法

2016-05-09 20:09 267 查看
题目链接: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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: