剑指offer 03.数组中重复的数字
Posted 红颜莫知己
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer 03.数组中重复的数字相关的知识,希望对你有一定的参考价值。
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
思路分析
方法一:Set
看到重复两个字我们一定要想起HashSet这个数据结构,它是基于HashMap实现的,是一个不允许出现重复元素集合
- 这道题中,我们可以用HashSet来存储遍历出来的值,若遇到重复值,赋予结果,break退出
java代码:
class Solution {
public int findRepeatNumber(int[] nums) {
Set set = new HashSet<Integer>();
int result = 0;
for (int num : nums) {
if(!set.add(num)){
result = num;
break;
}
}
return result;
}
}
复杂度分析
时间复杂度
O(n),遍历数组使用O(n)
空间复杂度
O(n),HashSet占的空间为n
方法二 :原地交换
如果是一道面试题,那么方法一就完全不够,谁都会,而且时间空间复杂度不行,我们需要改进
我们不定义额外的空间,就在传进来的数组中进行检查,由于数组长度为n,数值范围却是0~n-1那说明数组中索引和值是一对多的
既然这样,我们将数组对应索引,对应值一一归为,当有一个值与其对应索引值相等,那说明该数字为重复数组,即
- nums[i] = nums[nums[i]]
若不符合条件,交换位置,直到数值回到对应索引
nums[i] != i
nums[i] != i
nums[i] != i
交换位置后,索引0~3都已经归为,所以不与其他索引进行交换,直到索引4,nums[i] != i;
java代码
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0 ; i < nums.length ;i++) {
while (nums[i] != i) {
if (nums[i] == nums[nums[i]])
return nums[i];
int temp = nums[i];
nums[i] = nums[temp];
nums[temp] = temp;
}
}
return -1;
}
}
复杂度分析
时间复杂度
O(n),遍历数组使用时间O(n)
空间复杂度
O(1),使用常数级别的额外空间
若有误,请指教!!!
以上是关于剑指offer 03.数组中重复的数字的主要内容,如果未能解决你的问题,请参考以下文章