03 数组中重复的数字
题目
在一个长度为n的数组里的所有数字都在0~n-1范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2和3。
C++ 题解
方法一
采用负值标记这个值出现过:
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
// 遍历整个数组
for(int i=0;i<nums.size();i++)
{
// 索引值应该是数据值-1,这里因为可能是负数,所以取绝对值
int index = abs(nums[i]) - 1;
// 如果是负值,表明这个数字出现过,加入到结果中
if (nums[index] < 0)
{
//这里 + 1 恰好就是abs(nums[i])
res.push_back(index + 1);
}
// 用负值标志这个数字出现过
nums[index] = -nums[index];
}
return res;
}
};
方法二
将元素存放到其应该所在的位置,再从头开始遍历,查找重复的元素:
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
// 遍历整个数组,将数字和索引对应起来,注意索引小1
for(int i=0;i<nums.size();i++)
{
// 如果没有出现重复的元素则一直交换元素
while(nums[i] != nums[nums[i]-1])
swap(nums[i],nums[nums[i]-1]);
}
// 遍历元素,发现索引与元素不对应就是重复的元素
for(int i=0;i<nums.size();i++)
{
if (nums[i] != i + 1)
res.push_back(nums[i]);
}
return res;
}
};
python 题解
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = []
for i in range(len(nums)):
if nums[abs(nums[i]) - 1] < 0:
res.append(abs(nums[i]))
nums[abs(nums[i]) - 1] *= -1
return res