LeetCode287 寻找重复数(Find the Duplicate Number)

题目:

思路一:

 如果可以改变数组的元素,可以先将数组排序,然后扫描数组从排序数组中找出重复元素

代码一:

 

  • 时间复杂度 O(nlog(n))
  • 空间复杂度 O(1) 

思路二

用set实现,遍历数组,如果set中没有该元素,则加入该元素,指针继续向下扫描 

代码二

  • 时间复杂度 O(n)
  • 空间复杂度 O(n)

思路三:

如果题目要求可以改变数组元素,则可以从头到尾依次扫描数组中的每个数字

   看下标为i的对应数字nums[i]是否等于i+1,

       如果是就接着扫描下一个数字;

       如果不是就看nums[i]应该放的正确下标nums[i]-1处对应的元素是否是nums[i]

  •              如果是的话说明nums[i]这个元素肯定重复了,因为它在下标i和下标nums[i]-1处都出现了
  •               如果不是的话就交换两个下标位置的数,把nums[i]放在它应该对应的下标下;

不断比较交换,直到发现元素应该在的位置上已经有和相同元素占着了,那么就返回该重复元素。

代码三

  • 时间复杂度O(n)
  • 空间复杂度O(1)

思路四

如果没有重复数字,从1-n的范围内只有n个数字,如果数组中1-n的范围内超过了n个数字,则一定存在重复

所以用二分查找法,将1-n的数字从中间数字m分为两部分,如果1-m内的数字个数大于m,则在这个区间内有重复数,

否则就在剩下的区间(m+1~n)内有重复数。有重复数的区间继续以此方法缩减范围

代码四

  • 时间复杂度 O(nlogn)
  • 空间复杂度  O(1)

思路五

数组【3,1,3,4,2】,假如看成一个链表问题,首先head是nums[0],即3,根据3找到nums[3],即4

根据4找到nums[4] 即2,根据2找到nums[2]即3,根据3找到nums[3],即4.....进入循环。

也就是说如果有重复的数,链表会有环,环的入口就是重复数。

代码五

  • 时间复杂度 O(n)
  • 空间复杂度O(1)

猜你喜欢

转载自blog.csdn.net/sinat_41917109/article/details/86368464