Leetcode 刷题

剑指 Offer 03. 数组中重复的数字

  • 难度:简单

题目

找出数组中重复的数字。

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

示例1

2 <= n <= 100000

提示

  • 各函数的调用总次数不超过 20000 次

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

class Solution {
public int findRepeatNumber(int[] nums) {
int i = 0;
while(i < nums.length){
// 已经排好序的
if(nums[i] == i){
i++;
continue;
}

// 如果在k == nums[i]的位置的数字等于位置i的数字,说明重复
if(nums[nums[i]] == nums[i]){
return nums[i];
}
// 将数字k(nums[i] == k) 放到位置k
// 首先将原本在位置k的数字temp放到当前位置i
int temp = nums[i];
nums[i] = nums[temp];

nums[temp] = temp;
}
return -1;
}
}

复杂度

  • 时间复杂度:遍历数组使用 $O(n)$,HashSet添加和查找都是 $O(1)$
  • 空间复杂度:HashSet占用 $O(n)$大小的额外空间

思路

  1. 利用哈希表元素的唯一性。