缺失数字
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
思路:
- 我们将每个数字 i 填到对应的nums[ i ] 上,具体如下:
- 遍历序列,初始化n的位置索引-1,认为其不存在。
- 若元素nums[ i ] 等于n,则记录n的当前位置索引 i。
- 若元素nums[ i ] 不等于n,则判断元素nums[ i ] 是否等于 nums[ nums[ i ] ]。
- 若不等于,则将nums[ i ] 和 nums[ nums[ i ] ] 交换值。
- 若等于,则说明不需要交换位置, 将i++。
代码:
方法1:
class Solution {
public:
//使用异或,那个在数组中没有出现的,在遍历中只出现1次
int missingNumber(vector<int>& nums)
{
int miss=nums.size();
for(int i=0;i<nums.size();i++)
{
miss^=(i^nums[i]);
}
return miss;
}
};
方法2:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int tmp;
int Nind=-1;
for(int i=0;i<n;)
{
//若为n,则这个位置暂时存放n
if(nums[i]==n)
{
Nind=i;
i++;
continue;
}
// 若不相等,则将nums[ i ] 和 nums[ nums[ i ] ] 交换值
if(nums[nums[i]]!= nums[i] )
{
tmp=nums[nums[i]];
nums[nums[i]]=nums[i];
nums[i]=tmp;
}else{ //若相等,则说明该位置排列好了, 将i++
i++;
}
}
return Nind==-1?n:Nind;
}
};
结果: