leetcode 268: Missing Number,难度easy.
0. 题干
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
1. 题解
解法1:排序后比对值和下标是否对应。
class Solution {
public:
static bool cmp(const int&a,const int&b)
{
return a<b; //从小到大排序
}
int missingNumber(vector<int>& nums) {
sort(nums.begin(),nums.end(),cmp);
for(int i=0;i<nums.size();i++)
{
if(nums[i]!=i)
return i;
}
return nums.size();
}
};
解法2:异或
// 利用异或的性质,相同的元素异或为0,任何元素和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;
}
// 想象一下,这个for循环+最后一个nums.size()遍历完了之后,
// 所有相同的元素,都被消成了0,只有 "腰间盘突出"的那个还在
// 这个就是我们要找的元素,把这个元素和0异或即为元素本身。
res = res^nums.size(); //别忘了其实有n+1个元素
return res;
}
};
解法3:等差数列求和
用数列和sum减去num中的数据,剩下的数据就是缺失的数据。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum=(nums.size()*(nums.size()+1))/2;
for(int i=0;i<nums.size();i++)
{
sum-=nums[i];
}
return sum;
}
};
解法4:等差数列求和的变种
class Solution {
public:
int missingNumber(vector<int>& nums) {
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum=sum-nums[i]+i;
// n运行完,nums的数组都被减掉了(i=0到i=n-1),少一个元素i=n。后面补上
}
return sum+nums.size();
}
};