集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]
提示:
2 <= nums.length <= 104
1 <= nums[i] <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-mismatch
(1)哈希表
(2)映射
具体思路参考如何同时寻找缺失和重复的元素。
//思路1————哈希表
public int[] findErrorNums(int[] nums) {
//键/值:数组nums中的元素/该元素出现的次数
HashMap<Integer,Integer> map = new HashMap<>();
int[] res = new int[2];
int n = nums.length;
//sum为1...n的元素之和
int sum = (1 + n) * n / 2;
for (int i = 0; i < n; i++) {
if (!map.containsKey(nums[i])) {
map.put(nums[i], 1);
//sum减去数组nums中所有不重复元素的和,剩下的值就是丢失的数字
sum -= nums[i];
} else {
//当前元素nums[i]已存在与map中,说明该元素就是重复元素
res[0] = nums[i];
}
}
res[1] = sum;
return res;
}
//思路2————映射
public int[] findErrorNums(int[] nums) {
int n = nums.length;
//dup为重复的元素,初始值为-1
int dup = -1;
for (int i = 0; i < n; i++) {
//数组nums中元素的最小值是1,所以将元素转换成索引时需要-1
int index = Math.abs(nums[i]) - 1;
if (nums[index] < 0) {
/*
如果当前索引对应的元素值为负数,则说明该元素之前出现过一次,
而现在再次出现,说明该元素即为重复的元素
*/
dup = Math.abs(nums[i]);
} else {
//将每个索引对应的元素变成负数,标记该元素,表示该元素出现过一次
nums[index] *= -1;
}
}
//miss为重复的元素,初始值为-1
int miss = -1;
for (int i = 0; i < n; i++) {
if (nums[i] > 0) {
//当前元素为正数,说明该元素对应的索引值没有出现过,将索引转换成元素即可
miss = i + 1;
break;
}
}
return new int[]{dup, miss};
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43004044/article/details/124140242
内容来源于网络,如有侵权,请联系作者删除!