LeetCode_映射_简单_645.错误的集合

x33g5p2x  于2022-04-14 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(303)

1.题目

集合 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

2.思路

(1)哈希表
(2)映射
具体思路参考如何同时寻找缺失和重复的元素

3.代码实现(Java)

  1. //思路1————哈希表
  2. public int[] findErrorNums(int[] nums) {
  3. //键/值:数组nums中的元素/该元素出现的次数
  4. HashMap<Integer,Integer> map = new HashMap<>();
  5. int[] res = new int[2];
  6. int n = nums.length;
  7. //sum为1...n的元素之和
  8. int sum = (1 + n) * n / 2;
  9. for (int i = 0; i < n; i++) {
  10. if (!map.containsKey(nums[i])) {
  11. map.put(nums[i], 1);
  12. //sum减去数组nums中所有不重复元素的和,剩下的值就是丢失的数字
  13. sum -= nums[i];
  14. } else {
  15. //当前元素nums[i]已存在与map中,说明该元素就是重复元素
  16. res[0] = nums[i];
  17. }
  18. }
  19. res[1] = sum;
  20. return res;
  21. }
  1. //思路2————映射
  2. public int[] findErrorNums(int[] nums) {
  3. int n = nums.length;
  4. //dup为重复的元素,初始值为-1
  5. int dup = -1;
  6. for (int i = 0; i < n; i++) {
  7. //数组nums中元素的最小值是1,所以将元素转换成索引时需要-1
  8. int index = Math.abs(nums[i]) - 1;
  9. if (nums[index] < 0) {
  10. /*
  11. 如果当前索引对应的元素值为负数,则说明该元素之前出现过一次,
  12. 而现在再次出现,说明该元素即为重复的元素
  13. */
  14. dup = Math.abs(nums[i]);
  15. } else {
  16. //将每个索引对应的元素变成负数,标记该元素,表示该元素出现过一次
  17. nums[index] *= -1;
  18. }
  19. }
  20. //miss为重复的元素,初始值为-1
  21. int miss = -1;
  22. for (int i = 0; i < n; i++) {
  23. if (nums[i] > 0) {
  24. //当前元素为正数,说明该元素对应的索引值没有出现过,将索引转换成元素即可
  25. miss = i + 1;
  26. break;
  27. }
  28. }
  29. return new int[]{dup, miss};
  30. }

相关文章