3. 数组中重复的数字

1. 描述

找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

2. 例子

示例 1:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3

3. 题解

n = m_nums.size()
时间复杂度: O(n)
空间复杂度: O(1)

我们令每个元素都回归到其自己的位置,也就是说数字 1 应当回到下标为 1 的位置,数字 5 也应当回到下标为 5 的位置
如果在此过程中,我们发现一个数字的位置已经存在与其值相同的数字,则我们发现了一个重复数字
虽然函数有两层循环,但实际每个数字最多只会被交换一次,所以其时间复杂度依旧为 O(n)

class Solution 
{
public:
    // int findRepeatNumber(vector<int>& nums)
    int findRepeatNumber(vector<int> &m_nums) 
    {
        for(int i = 0; i < m_nums.size(); i++)
        {
            while(m_nums[i] != i)
            {
                if(m_nums[m_nums[i]] == m_nums[i])
                    return m_nums[i];

                swap(m_nums[i], m_nums[m_nums[i]]);
            }
        }
        
        return -1;
    }
};
comments powered by Disqus