今天继续刷LeetCode,第268题,给定一个0-n的数组,求遗漏的数
分析:
方法一:输入的是0-n的乱序数组,长度为n,那么要找出其中遗漏的数,可以先将数组进行排序,然后遍历整个数组,出现下标与元素不匹配的时候,就是遗漏的数,这个需要两次遍历数组,时间开销比较大。
方法二:如何在一次遍历的情况下,就得到结果呢。根据数据元素的特性,先求和0-n的所有数的和,然后遍历整个数组,并且从和中减去每个元素,最后得到的结果就是遗漏的数,结果显示还可以有更好的方法。
方法三:通过按位与的方式,将所有元素值与下标进行按位与,得到的结果就是缺失的那一个,但是仍然需要遍历整个数组,可是时间开销就小了很多。
问题:
1、与操作会比四则运算快;
附上C++代码1:
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
if(i!=nums[i])
return i;
}
return nums.size();
}
};
附上C++代码2:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int res=n;
for(int i=0;i<n;i++)
{
res^=nums[i]^i;
}
return res;
}
};
附上Python代码:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
n=len(nums)
return n*(n+1)//2-sum(nums)