Leetcode刷题 ——消失的数字
专题:Leetcode刷题系列
作者:暴躁小程序猿
简介:双非本科大二小菜鸟一枚,希望和大家一同进步~
题目要求
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例一:
输入:[3,0,1]
输出:2
示例二:
输入:[9,6,4,2,3,5,7,0,1]
输出:8
一、方法一
思路解析
方法一是根据题目的特殊性,用1加到n的总和 - 数组求和 = 消失的数字
时间复杂度为O(n).
具体代码实现
int missingNumber(int* nums, int numsSize)
{
int sum=0;
int miss=0;
//1到n的总和
sum=(1+numsSize)*numsSize/2;
//数组求和
for(int i=0;i<numsSize;i++)
{
miss+=nums[i];
}
miss=sum-miss;
return miss;
}
二、方法二
思路解析
开辟一块临时空间,用来标记数组中出现的元素。
时间复杂度O(n)
具体代码实现
代码如下(示例):
int missingNumber(int* nums, int numsSize){
int* p = (int*)malloc(sizeof(int) * (numsSize + 1));
for (int i = 0; i < numsSize + 1; i ++ ) {
p[i] = -1;
}
for (int i = 0; i < numsSize; i ++ ) {
p[nums[i]] = nums[i];
}
int res = 0;
for (int i = 0; i < numsSize + 1; i ++ ) {
if (p[i] == -1) {
res = i;
break;
}
}
return res;
}
三、方法三
思路分析
利用异或运算求解。
相同为0,不同为1.
使用一个for循环来让从0-numSize-1的数与num[]的元素异或。
具体代码实现
代码如下(示例):
int missingNumber(int* nums, int numsSize){
int result=numsSize;
for(int i=0;i<numsSize;i++){
result^=i^nums[i];
}return result;
}
总结
本篇博客是小猿刷Leetcode刷题——消失的数字的三种方法,希望可以给大家提供一些思路,会持续更新自己学习的笔记和刷题的解法等,我么明天见~