题目
该题目取自力扣(LeetCode)面试题 17.04. 消失的数字
该题目主要考察时间复杂度的把握,题目如下:
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:
输入:[3,0,1]
输出:2
示例 2:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
最后所以的源码放在最后
思路一(时间复杂度O(N),空间复杂度O(1))
也是最简单的一种思路,就是把一到N个数全部相加再减去一到N用数组表示的数,我也觉得这个方法是最优解,因为他的思想也不难。用1+2+3....+n去减去arr[0]+arr[1]...+arr[n-1]。
思路二(时间复杂度O(N),空间复杂度O(N))
这个方法我认为也是最难理解的一种方法,首先先创造一个动态数组,然后把动态数租对比元数组要多一个数,再把-1全部放入这个动态数组中,然后对比之前的那个数组把那个数组的数放置在动态数组中下标所对应的数中去,然后最后那个下标为-1的值,那就是要找的那个数字。就好比如果有五个萝卜,我挖六个坑全部填进去之后看哪个坑上没有萝卜,那就是我要找的那个坑。
思路三(时间复杂度O(N),空间复杂度O(1))
给一个值X等于0,X先跟0到N的所有值异或,x在和数组中的每一个值异或,最后的X就是缺的那个数。两数异或值为0。
源码
//int missingNumber(int* nums, int numsSize)
//{
// int tmp = 0;
// int x = 0;
// for (int i = 0; i <= numsSize; i++)
// {
// tmp += i;
//
// }
// for (int j = 0; j <= numsSize - 1; j++)
// {
//
// x += nums[j];
// }
// return tmp - x;
int missingNumber(int* nums, int numsSize)
//{
// int x = 0;
// for (int i = 0; i < numsSize; i++)
// x ^= nums[i];
// for (int j = 0; j < numsSize + 1; j++)
// x ^= j;
// return x;
//}
//int missingNumber(int* nums, int numsSize)
//{
// int* temp = (int*)malloc(sizeof(int) * (numsSize + 1));
// if (temp == NULL)
// {
// printf("%s\n,strerror(errno)");
// return 0;
// }
// int i = 0;
// for (i = 0; i < numsSize + 1; i++)
// {
// *(temp + i) = -1;
// }
// for (i = 0; i < numsSize; i++)
// {
// temp[*nums] = *nums;
// nums++;
// }
// for (i = 0; i < numsSize + 1; i++)
// if (*(temp + i) == -1)
// {
// free(temp);
// temp == NULL;
// return i;
// }
// }
// return 0;
//}