剑指offer 03.数组中重复的数字
题目描述
解题思路
哈希表
注意一个用法,HashSet的add
方法,如果要插入的元素产生了重复,则直接返回false。
时间:o(n),空间:o(n)
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
int res = -1;
for (int num : nums) {
//如果add重复元素,则返回false
if (!set.add(num)) {
res = num;
break;
}
}
return res;
}
}
原地置换
遍历数组,对号入座。
如果当前元素已经在对应下标的位置里,则跳过;
如果当前元素不在对应下标的位置,则需要置换。置换前,先判断对应下标的位置是否已经放了满足条件的元素(即nums[i] == i
)。若已经放了,则直接返回重复元素,否则就置换到对应位置,并进行下一轮判断。
时间:o(n),空间:o(1)
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
//如果不在对应位置,则需要置换
while (nums[i] != i) {
//如果对应位置已经放了满足条件的元素,则直接返回重复元素
if (nums[nums[i]] == nums[i]) {
return nums[i];
}
//否则就进行置换
int tmp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = tmp;
}
}
return -1;
}
}