【leetcode】消失的数字

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞吗,感谢❤️
在这里插入图片描述


目录

    • 1.暴力求解法
    • 2.采用异或的方法(同单身狗问题)
    • 3.先求和再减去数组元素

点击查看题目

【leetcode】消失的数字_第1张图片


1.暴力求解法

通过2个for循环,遍历查找0-n中缺少的数字,比较简单,不写,时间复杂度为O(N^2)


2.采用异或的方法(同单身狗问题)

点击去了解异或,位置在④.3
异或:两个整数的相同位置:相同为0,不同为1(二进制),易知a^ a=0,a^ 0=a;具有交换律,所以a^ b^ a=a^ a^ b=0^b=b。
在本题中,先使x=0(因为0^ 任何数=任何数本身),再让x与0-n(n是数组的元素个数)的所有数字异或,再让x与nums数组的全部元素异或;当数组为[3,0,1]时,x与0-3的全部数字异或,再与数组元素[3,0,1]异或,即
【leetcode】消失的数字_第2张图片
这样就能得出消失的数字,执行次数为2n+1,时间复杂度为O(N),代码为:

int missingNumber(int* nums, int numsSize) {
	int x = 0;
	for (int i = 0; i <= numsSize; i++)
	{
		x ^= i;
	}
	for (int i = 0; i < numsSize; i++)
	{
		x ^= nums[i];
	}
	return x;
}

3.先求和再减去数组元素

先求出0-n(n是数组的元素个数)所有数字之和,再减去数组nums中的所有元素,得到的自然是消失的数字。如当数组为[3,2,0,1]时,求出0-4所有数的和=10,再-0-1-2-3=4,所以消失的数字是4。
时间复杂度为O(N),代码为:

int missingNumber(int* nums, int numsSize) {
	int sum = (numsSize+1) * (0 + numsSize) / 2;
	for (int i = 0; i < numsSize; i++)
	{
		sum -= nums[i];
	}
	return sum;
}

好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞吗,感谢看到这里,我们下篇博客见❤️

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)