携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情
一、题目描述:
集合
s包含从1到n的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。给定一个数组
nums代表了集合S发生错误后的结果。请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]
提示:
- 2 <= nums.length <= 10^4
- 1 <= nums[i] <= 10^4
二、思路分析:
第一步:找出重复的数:利用hash表,遍历数组,将数组中的元素填入哈希表,填入之前先检测表中是否有该元素。如果有,这个元素就是重复的元素。
第二步:找出没有的数,由于数是从1-n,如果没有错误的话可以求出1-n的和(等差数列求和),而错误数列的和-重复的元素+缺少的元素应该等于(1+n)*n/2。根据这个方程,先求出错误数列的和以及重复的元素,然后即可解出缺少的元素。
三、AC 代码:
class Solution {
class Solution {
public int[] findErrorNums(int[] nums) {
int sum=0,dup=0;
int len=nums.length;
Map <Integer,Integer> map= new HashMap<Integer,Integer>();
for(int i:nums)
{
sum=sum+i;
if(map.containsKey(i))
dup=i;
else
map.put(i,1);
}
int ans=(1+len)*len/2-(sum-dup);
return new int[]{dup,ans};
}
}
范文参考:
「java」借助『辅助数组』解决 "错误的集合" 的具体解题思路 - 错误的集合 - 力扣(LeetCode)
(努力才会有成果) 可能是c++中最简单的写法了(原地遍历,不需要额外空间,时间复杂度O(N),空间复杂度O(1)) - 错误的集合 - 力扣(LeetCode)