Leetcode每日一题——“消失的数字”

各位CSDN的uu们你们好呀,今天,小雅兰又开新专栏了,以后会在Leetcode上面进行刷题,尽量每天写一道,请大家监督我!!!好啦,让我们进入Leetcode的世界吧


力扣


对于这道题目,有很多种解法,接下来就由小雅兰来你们细细剖析!!!


解法一:

排序,依次查找,如果下一个数不是上一个数+1,那么上一个数+1就是消失的数字!!! 

但是这种方法,时间复杂度过高,不符合力扣的要求

利用冒泡排序的话,时间复杂度为O(N^2) 

利用qsort(快速排序)的话,时间复杂度为O(N*logN)

但是这道题目要求时间复杂度为O(N)

那么,这种方法就不行,那这种方法小雅兰就不写这种方法的代码啦


解法二:

异或  相同为0,相异为1

  •  首先,把x赋值为0
  • for循环,让x和nums数组的每一个元素异或
  • 然后又一个for循环,让x和0到numsSize的数字异或
  • 最后的答案就是只出现一次的数字
  • 最后异或的结果就是我们要求的消失的数字
int missingNumber(int* nums, int numsSize)
{
  int i=0;
  int x=0;
  for(i=0;i<numsSize;i++)
  {
     x^=nums[i];
  }
  for(i=0;i<numsSize+1;i++)
  {
      x^=i;
  }
  return x;
}

解法三:

利用数学公式

等差数列求前n项和的公式为:Sn=n*(n+1)/2

求完和之后,减去nums数组中的所有的值,最后结果就是消失的数字啦

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

好啦,小雅兰今日刷题经验就到这里啦,还要继续加油噢!!!

 

猜你喜欢

转载自blog.csdn.net/weixin_74957752/article/details/130171174