题目:
思路一:
如果可以改变数组的元素,可以先将数组排序,然后扫描数组从排序数组中找出重复元素
代码一:
- 时间复杂度 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)