题目链接:https://leetcode.cn/problems/missing-number-lcci/
📕题目要求:
数组nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在
O(n)时间内完成吗?
注意:本题相对书上原题稍作改动
🧠解题思路
方案一:
先对数组进行排序,再依次进行查找,如果下一个数不是上一个数+1,那么上一个数+1就是消失的数字。
但是该方案不满足题目设的要求(时间复杂度为O(n)),排序+查找最理想的时间复杂度为O(N*logN)。因此在这里就不再进行详细赘述。
方案二:
根据单身狗系列问题,我们可以利用异或去解决这类有明显特征的题目,将出现两次的数字进行异或得零。最终剩余的数即为消失的数字。
方案三:
由于题目中的数组元素是0到n的整数中缺少了一个,因此我们可以通过计算等差数列前n项和,在依次减去数组中的值,剩下的数字即为消失的数字。
🍭代码示例
方案二代码示例如下:
int missingNumber(int* nums, int numsSize)
{
int x = 0;
for(int i = 0;i<numsSize;i++)
{
x^=nums[i];
}
for(int i = 0;i<numsSize+1;i++)
{
x^=i;
}
return x;
}
方案三代码示例如下:
int missingNumber(int* nums, int numsSize)
{
int ret = numsSize*(numsSize+1)/2;
for(int i = 0;i<numsSize;i++)
{
ret = ret - nums[i];
}
return ret;
}
这就是我对本题的理解,如果大家有更优的解,欢迎交流,一起进步!