题目:给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
示例 1:
输入: [3,0,1]
输出: 2
示例 2:
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
说明:
你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?
(来源:力扣(LeetCode))
思路:第一眼看到这个题目的时候想到的肯定是先对给定的数据进行排序,然后依次检查,返回缺失的那个数字。那,能不能用另一种方法代替排序算法(毕竟排序算法比较麻烦),来实现题目要求实现的功能?肯定是有的。大致的思路是:另设一个数组,将这个数组的下标与题目给定的数组中的数联系起来,比如a[0]=0,a[1]=1……将a[没有出现的数字]这个元素置-1,比如,输入的是3,0,1,2没有出现,那么,a[2]=-1,最后,只要返回数组中元素为-1的元素的下标,就是原来数列中缺少的元素。
代码:
int missingNumber(int* nums, int numsSize)
{
int *a,i;
a=(int*)malloc((numsSize+1)*sizeof(int));
/*举个例子,当输入的numsSize为5时,因为它缺少一个
数,所以新开辟的存储空间需要在原来的numsSize的基础上
加1*/
for(i=0;i<numsSize;i++)
a[i]=-1;
for(i=0;i<numsSize;i++)
a[nums[i]]=nums[i];
for(i=0;i<numsSize;i++)
{
if(a[i]==-1)
break;
}
return i;
}
这其实应该是哈希表的思想。