leetcode面试题17.04:消失的数字(C语言版)

思路1

先排序,再依次查找,如果下一个值不等于前一个+1,那么下一个值就是消失数字。

时间复杂度分析:冒泡排序的时间复杂度为O(N^2),qsort排序时间复杂度为O(N*logN)。因此该思路不可行。


思路2

求和0到N,再减去数组中求和的值。

时间复杂度分析:两次循环,结果为O(N)。因此该思路可行,但有内存溢出风险。(这边可以通过等差数列求和公式求和,这样只需要一次循环,速度更快)


思路3

通过异或操作符号,相同的值为0,不相同的值为1;因为有 a^a = 0 已经 0^a = a 这两条性质,第一次遍历循环把数组全部的元素异或,第二次遍历循环再把numSize大小的元素异或,那么就可以找到只出现了一次的数字,即为消失的数字。(可以通过下图辅助理解)

时间复杂度:两次次循环,结果为O(N)。因此该思路可行,同时没有溢出风险,是最优解。

思路2的代码:

cpp 复制代码
int missingNumber(int* nums, int numsSize){
    int sum=0,i=0,cmp=0;
    for(i=0;i<numsSize;i++)
        sum+=nums[i];
    for(i=0;i<=numsSize;i++)
        cmp+=i;
    return cmp-sum;
}

思路3的代码:

cpp 复制代码
int missingNumber(int* nums, int numsSize){
    int N=numsSize;
    int x=0;
    for(int i=0;i<numsSize;i++)
    {
        x^=nums[i];
    }
    for(int j=0;j<=N;j++)
    {
        x^=j;
    }
    return x;
}
相关推荐
重生之后端学习14 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
旖旎夜光18 小时前
LeetCode 852:山脉数组的峰顶索引(二分查找) —— 题解
数据结构·c++·算法·leetcode·二分查找
LuminousCPP1 天前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode
青 春 记 忆1 天前
LeetCode 155. 最小栈|Python 解法详解
开发语言·python·leetcode
鹿角片ljp2 天前
LeetCode 46. 全排列|吃透回溯
算法·leetcode·职场和发展
.道阻且长.2 天前
11.LeetCode算法习题讲解--滑动窗口--将x减到0的最小操作数
算法·leetcode·职场和发展
wenyq72 天前
LeetCode 2460. Apply Operations to an Array
算法·leetcode
青 春 记 忆2 天前
LeetCode 142. 环形链表 II|Python 解法详解
python·leetcode·链表
小欣加油2 天前
leetcode3069 将元素分配到两个数组中I
数据结构·c++·算法·leetcode·职场和发展
从琳开始9892 天前
优选算法——双指针(算法原理+力扣题)
算法·leetcode·职场和发展