欢迎来到 s a y − f a l l 的文章 欢迎来到say-fall的文章 欢迎来到say−fall的文章
前言:
今天再给大家带来一个题目的三个思路供大家思考
正文:
消失的数字
- 思路一:排序+遍历
int missingNumber(int* nums, int numsSize)
{
int compare(const void* a, const void* b)
{
return *(int*)a - *(int*)b;
}
//排序
qsort(nums,numsSize,sizeof(int),compare);
//遍历
for(int i = 0;i<numsSize;i++)
{
if(nums[i] != i)
{
return i;
}
}
return numsSize;
}
- 时间复杂度:O(n log n)
对于qsort排序(快速排序法)来说,时间复杂度是O(n log n)
对于后面的循环遍历来说,取最坏结果时间复杂度是O(n)
总的来说取qsort排序为主导项,为O(n log n)
- 思路二:求和减去,最后的结果就是消失的数字
//思路二:求和减去数组全部元素
int missingNumber(int* nums, int numsSize)
{
//利用等差公式求和
int sum = numsSize * (numsSize + 1) / 2;
//遍历全部减去
for (int i = 0;i < numsSize;i++)
{
sum -= nums[i];
}
return sum;
}
- 时间复杂度:O(n)
求和以后只有依次遍历,时间复杂度为O(n),但数字太大可能有溢出风险
- 思路三:位运算
int missingNumber(int* nums, int numsSize)
{
int missing = numsSize;//设定missing为numusSize,补全数集
for (int i = 0; i < numsSize;i++)
{
missing ^= i ^ nums[i];
//利用异或的自反性(a^a = 0),出现相同的数字就消失,只留下不同的数字
}
return missing;
}
- 时间复杂度: O(n)
仅需一次遍历,甚至空间上不会有溢出风险
- 本节完…

532

被折叠的 条评论
为什么被折叠?



