127、错误的集合
题目描述:
集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
注意:
给定数组的长度范围是 [2, 10000]。
给定的数组是无序的。
还算容易的一道题目,基本上是一步跑出来了,跟之前的相对名次是一个思路,用一个数组存放其值,需要注意的是如果最大值不是nums.length,那么肯定是max丢失了,这点需要注意一下,其余没什么的,
看了一下取得max的值,这里可以直接将max设定为max.length+1嘛,怎么那么死板
class Solution {
public int[] findErrorNums(int[] nums) {
int result[] = new int[2];
int max = nums[0];
for (int i = 1; i < nums.length; i++) {
if(nums[i] > max){
max = nums[i];
}
}
if(max != nums.length){
result[1] = nums.length;
}
int []tem = new int[max+1];
for (int i = 0; i < nums.length; i++) {
tem[nums[i]] ++;
}
for (int i = 1; i < tem.length; i++) {
if(tem[i] == 2){
result[0] = i;
}
if(tem[i] == 0){
result[1] = i;
}
}
return result;
}
}
瞬间就提高了2ms,我去计算一个max就耗费2ms看来要在细节处进行优化啊
排名靠前的代码,有点懵逼,个人觉得我的那个简单易懂
class Solution {
public int[] findErrorNums(int[] nums) {
/*hash数组:索引代表x-1的元素,数组值表示元素出现的次数,出现0次表示缺失数据,出现2次表示重复元素*/
/*
ArrayList<Integer> array=new ArrayList<>();
HashMap<Integer,Integer> map=new HashMap<>();
for(int num:nums){
map.put(num,getOrDefault(num,0)+1);
}
for(int v:map.getValue){
if(v==1){
continue;
}else if(v==2){
array.add(map.getKey());
}else{
array.add(map.getKey());
}
}
return array.toArray();
*/
int m=nums.length;
for(int i=0;i<m;i++){
while(nums[i]!=i+1&&nums[nums[i]-1]!=nums[i]){
swap(nums,i,nums[i]-1);
}
}
for(int i=0;i<m;i++){
if(nums[i]!=i+1){
return new int[]{nums[i],i+1};
}
}
return null;
}
private void swap(int[] nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}