题目:
思路:
这个题目说明是【0,n-1】,所以可以进行原地修改,下标和数值的一一对应,比如这里,我的a的值是1,那么他对应的下标就是1,将nums[1]的值改为1 + (nums.length + 1)。注意:这里一定要是(nums.length + 1)。【修改后的数字会通过取余得到原来的】
代码:
class Solution {
public int findRepeatNumber(int[] nums) {
//映射
if (nums.length == 0) {
return -1;
}
for (int i = 0; i < nums.length; i++) {
int a = nums[i] % (nums.length + 1);
if (nums[a] > nums.length) {
return a;
} else {
nums[a] += nums.length + 1;
}
}
return -1;
}
}
进阶题目:
思路:
同上题,无非要注意以下边界,这里是[1,n],所以,要下标对应的话,就变成[a-1].
具体代码:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> ans=new ArrayList<>();
for(int i = 0; i < nums.length; i++){
int a = nums[i] % (nums.length + 1);
if (nums[a-1] > nums.length) {
ans.add(a);
} else {
nums[a-1] += nums.length+1;
}
}
return ans;
}
}