数组中的重复数字
题目1
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
思路1:
直接对数组排序然后遍历,然后从头到尾扫描一遍。排序时间
O
(
n
l
o
g
n
)
\ O(nlogn)
O(nlogn)
思路2:
剑指提供的思路:数组中的数字都在0~n-1,从头到尾扫描数组,如果某个数等于其下标则继续,否则将其放到对应的下标处。时间
O
(
n
)
\ O(n)
O(n) 空间
O
(
1
)
\ O(1)
O(1)
C++
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int length = nums.size();
for(int i=0;i<nums.size() ;++i)
{
while(nums[i]!=i)
{
if(nums[i]==nums[nums[i]])
return nums[i];
int temp = nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
};
python
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
nums.sort()
length = len(nums)
for i in range(len(nums)-1):
if nums[i]==nums[i+1]:
return nums[i]
if nums[length-2]==nums[length-1]:
return nums[length-2]
题目2 不修改数组找出重复数字
在长度为n+1的数组里,所有数字都在1~n的范围内,所以必有重复,找出重复数字。
思路1:
不能修改数组,但是可以再申请一个新的数组,空间
O
(
n
)
\ O(n)
O(n),然后逐一把原数组中的每个数字复制到新数组中,令下标等于值,一遍扫描即可。
思路2:
不申请新的空间,类似二分查找的过程,通过比较元素个数和区间长度,比如[1,5]这个区间有6个数,则必含重复。以时间换空间,时间
O
(
n
l
o
g
n
)
\ O(nlogn)
O(nlogn)。