您的位置:首页 > 其它

LeetCode题解:Missing Number

2015-09-24 10:14 127 查看

题目链接:

Missing Number

题目描述:

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?

题目解释:

给定一个数组,数组中的元素取自0~n,而且元素各不相同,找到数组中缺失的那个元素。

例如:一个数组中有三个元素0,1,3,那么这个数组实际上是从0~3中取的数,缺失的那个数字就是2.

这里要注意一点:数组中的元素不一定是有序的,0 1 3,的顺序也可以是 3 1 0,这样的数组的输出结果是一样的。

解题方案:

这个题目要求线性的时间复杂度,我最初的想法是将这个数组排序,然后再从头遍历,遇到的那个数组元素跟下标索引不一致的元素,将这个减一就是Missing Number.

现在来看,我们最初的想法是不可以的了,那怎么办呢,只能用空间换取时间了,我们令开辟一个n大小(这里的n就是取数范围0~n的n)的布尔型数组,然后采用哈希的思想,将数字k标注在array[k]的位置,如果k存在,那么array[k]为true,遍历完第一遍以后,再从头遍历一边,找出array[i]为false的元素,此时缺失的元素就是i。

当然这里不要忘记初始化咱们的布尔型数组,初始值设为false

这种方法虽然有点LOW,但是还是AC了哈哈,先看这个方法实现的代码:

int missingNumber(int* nums, int numsSize)
{
bool isHave[numsSize];

for (int i = 0; i < numsSize; ++i)
{
isHave[i] = false;
}

for (int i = 0; i < numsSize; ++i)
{
isHave[nums[i]] = true;
}

for (int i = 0; i < numsSize; ++i)
{
//isHave[nums[i]] = true;
if(isHave[i] == false)
{
return i;
}
}
return numsSize;
}


这样的题目,很明显还有更好的方法,比如位运算,只是我们想不到具体的实现,我就去网上检索了,下面这个方法是网上的,我还是没整明白这个位运算是,哎,先把代码贴上来吧,留个笔记:

int missingNumber(int* nums, int numsSize)
{
int n = 0;

for (int i = 0; i < numsSize; ++i)
{
n ^= (i+1) ^ nums[i];
}
return n;
}


位运算是硬伤呀,哀叹~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode