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;
}
};