可以修改数组找出数组中重复的数字
给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。
请找出数组中任意一个重复的数,但不能修改输入的数组。
样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。
返回 2 或 3。
要求 如果只能使用 O(1) 的额外空间和使用o(n)的时间来解决
思路
寻找重复的元素很容易想到用hash表进行遍历如果存hash表中存在这个元素说明找到了重复的元素这种方法可以在o(n)的时间内解决问题但是用到了o(n)的额外空间复杂度不符合要求。
题目中所有的数字都在[0,n-1]的区间范围内因此hash表的大小为n因此我们实际要做的就是对n个范围为0到n-1的数进行哈希,而哈希表的大小刚好为n
对排序算法比较熟悉的同学不难发现这与一种经典的排序算法(基数排序)非常类似。而基数排序的时间空间复杂度刚好符合题目要求。因此尝试使用基数排序来解这道面试题。
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
for(auto x:nums)
{
if(x<0||x>=nums.size()) return -1;
}
for(int i=0;i<nums.size(); )
{
if(nums[i]!=i)
{
if(nums[i]==nums[nums[i]])
return nums[i];