剑指 Offer 03. 数组中重复的数字
思路
刚看到这题立马想到遍历存到set中,然后再去contains去比
但是这样太简单了并且空间复杂度O(n),那么既然是数组,原地置换可不可以呢。这样空间复杂度就是O(1)了
原地置换
分析步骤
原地置换的话,谁跟谁换是个问题,那我们就定个规矩
数组下标就是元素的值。
例:array[0] = 0
,array[1] = 1
…以此类推
- 遍历数组
- 如果当前下标和元素的值不对应,那就置换
- 如果发现被占则直接返回这个元素的值
注:思路没问题,但是要注意,每一次遍历开始的时候都要先判断一下这个位置是否被占了
代码
class Solution {
public int findRepeatNumber(int[] nums) {
for (int i = 0; i < nums.length; i++) {
//如果当前元素和当前下标的值不一样,则先判断元素的位置是否被占
while (nums[i] != i){
//记录下标
int index = nums[i];
//发现被占,则直接返回
if (nums[index] == nums[i]){
return nums[i];
}
//没被占,则置换
int temp = nums[index];
nums[index] = nums[i];
nums[i] = temp;
}
}
return -1;
}
}