思路:时间复杂度O(N),空间复杂度O(N)
使用额外的数组空间来存储出现的次数
class Solution {
public int[] findErrorNums(int[] nums) {
int[] tmp = new int[nums.length+1];
int repeated = 0;
int n = nums.length;
int sum = n*(n+1)/2;
for(int i = 0;i < nums.length;i++){
if(tmp[nums[i]] != 0){
repeated = nums[i];
continue;
}
tmp[nums[i]]++;
sum -= nums[i];
}
return new int[]{repeated,sum};
}
}
2.还有时间复杂度是O(N),空间复杂度是O(1)的做法
就是让数组中的每个元素回到自己应该在的位置上,那么不在自己位置上的数字即为重复的且缺失的。
class Solution {
public int[] findErrorNums(int[] nums) {
for(int i = 0;i < nums.length;i++){
while(nums[i] != i+1 && nums[nums[i]-1] != nums[i]){//必须用循环才行
swap(nums,i,nums[i]-1);
}
}
for(int i = 0;i < nums.length;i++){
if(nums[i] != i+1){
return new int[]{nums[i],i+1};
}
}
return new int[]{};
}
public void swap(int[] nums,int i,int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}