03 数组中重复的数字

题目

在一个长度为n的数组里的所有数字都在0~n-1范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2和3。

Leetcode

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
            
posted @ 2019-02-20 08:31  youngliu91  阅读(187)  评论(0编辑  收藏  举报