Leetcocde剑指 Offer 03. 数组中重复的数字(哈希表+原地置换法)
Posted !0 !
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcocde剑指 Offer 03. 数组中重复的数字(哈希表+原地置换法)相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
解题思路
方法一:HashSet
这和我们之前两数之和的做法差不多,直接遍历数组,如果在哈希表中不存在,就加入哈希表.存在就直接返回答案。由于哈希表查找效率为O(1),所以整体时间复杂度为O(n)
代码
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i : nums) {
if(set.contains(i))
return i;
set.add(i);
}
return -1;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(n)
方法二:原地置换法
我们这里其实有一种更为巧妙的方法–原地置换法。这个方法可以把空间优化成O(1),下面我们来看一下思路。
由题我们可以发现n个数字都是在0~n-1的范围内,那么我们可以让一个下标对应一个数字,我们可以发现因为出现了重复数字,所以肯定会有至少一个位置上面会有几个数字,那么这个数字就是我们要找的重复数字。具体实现看代码。
代码
class Solution {
public int findRepeatNumber(int[] nums) {
for(int i = 0; i < nums.length; i++) { //从下标0开始
int t = i; //代替i去置换
while(nums[t] != t) { //如果下标和数字不对应
if(nums[t] == nums[nums[t]]) //把数字当作下标去找对应下标的数字,如果相等,就代表这个数十重复数字
return nums[t];
int k = nums[nums[t]]; //如果不相等直接交换
nums[nums[t]]= nums[t];
nums[t] = k;
}
}
return -1;
}
}
复杂度分析
- 时间复杂度:O(n)
- 空间复杂度:O(1)
以上是关于Leetcocde剑指 Offer 03. 数组中重复的数字(哈希表+原地置换法)的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字
剑指 Offer(C++版本)系列:剑指 Offer 03 数组中重复的数字