标签:
题目:
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
思路:用STL的set可以轻松实现,时间复杂度为O(N),空间复杂度为O(N).
set<int> myset;
for(int i=0;i<nums.size()+1;i++)
{
myset.insert(i);
}
for(int i=0;i<nums.size();i++)
{
myset.erase(nums[i]);
}
set<int>::iterator it=myset.begin();
return *it;
优化:很简单的题目,是否可以把空间复杂度降为O(1)。
int len = nums.size();
int sum = 0;
for(int i = 0; i < len; ++i)
sum += nums[i];
int ideal_sum = 0;
ideal_sum = (0+len)*(len+1)/2;
return ideal_sum - sum;
计算加和,多出的部分就为原数组少了的部分。
或者一种更快的方法,利用异或(XOR),就像解一个数组里面所有数都出现两次只有一个数出现一次的题目一样,将所有数异或,剩余数即为少了的数字。
int missing =0;
for(int i=0; i<nums.size();++i)
missing ^= ((i+1)^nums[i]);
return missing;
考虑(i+1),相当于将1到n拿去和1到n(有一个值缺少)异或,前面的0对异或并没有贡献。而对于缺少最后一个数的特殊情况,也能正确处理。
标签:
原文地址:http://www.cnblogs.com/herebolgs/p/4761759.html