题目分析:[[EVD]] - 剑指 Offer 03. 数组中重复的数字https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
简单描述:
- 找出数组中任意一个重复的数字
限制🚫
- 2 <= n <= 100000
- 所有数字都在 0~n-1 的范围内
示例:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
解题思路:
思路:
- 1.排序后找相邻的数字 #排序
- 利用algorithm中的sort(底层实现为快速排序、插入排序、堆排序的混合) #[[C++ STL]]
- 2.利用哈希找出重复 #哈希表
- 打表
- 原地哈希
效率:
- 1.排序+遍历 时间复杂度, 空间复杂度
- 2.哈希表 时间复杂度
- 打表: 空间复杂度
- 原地哈希: 空间复杂度
代码:
- 1.排序+遍历
class Solution
{
public:
/*排序+找相邻是否重复*/
int findRepeatNumber(vector<int> &nums)
{
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++)
if (nums[i] == nums[i + 1])
return nums[i];
return -1;
}
};
- 2.哈希表
- 打表
class Solution
{
public:
/*哈希表*/
int findRepeatNumber(vector<int> &nums)
{
int n[nums.size()];
memset(n, 0, sizeof(n));
for (int i = 0; i < nums.size(); i++)
if (++n[nums[i]] > 1)
return nums[i];
return -1;
}
};
- 原地哈希
class Solution
{
public:
/*哈希计算,不断交换位置,直到放到相应位置*/
int findRepeatNumber(vector<int> &nums)
{
for (int i = 0; i < nums.size(); i++)
while (i != nums[i])
{
if (nums[i] == nums[nums[i]])
return nums[i];
swap(nums[i], nums[nums[i]]);
}
return -1;
}
};