力扣-第645题《错误的集合》
一 . 问题描述
集合 s
包含从 1
到 n
的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums
代表了集合 S
发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
二 . 了解概念
-
重复数字:在数组中出现了两次的数字
-
缺失数字:在
1
到n
范围内应该存在但未出现在数组中的数字 -
哈希表:用于统计数字出现频率的数据结构
三 . 解题思路
-
使用哈希表统计每个数字的出现次数
-
遍历
1
到n
的所有数字:-
如果数字不在哈希表中,则为缺失数字
-
如果数字在哈希表中且出现次数为2,则为重复数字
-
-
返回找到的重复数字和缺失数字
四 . 解题过程
class Solution {public int[] findErrorNums(int[] nums) {int[] arr = new int[2];LinkedHashMap<Integer, Integer> hashMap = new LinkedHashMap<>();for (int name : nums) {if (hashMap.containsKey(name)) {int count = hashMap.get(name);count++;hashMap.put(name, count);} else {hashMap.put(name, 1);}}for (int i = 1; i <= nums.length; i++) {if (!hashMap.containsKey(i)) {arr[1] = i;} else if (hashMap.get(i) == 2) {arr[0] = i;}}return arr;}
}
五 . 时间复杂度和空间复杂度
-
时间复杂度:O(n)
-
第一次遍历数组统计频率:O(n)
-
第二次遍历1到n检查数字:O(n)
-
总体为线性时间复杂度
-
-
空间复杂度:O(n)
-
使用了哈希表存储数字及其出现次数,最坏情况下需要存储n个键值对
-
六 . 自我反思(优化建议)
-
空间优化:可以使用数组代替哈希表来统计频率,因为数字范围已知(1到n),可以节省哈希表的开销
-
数学方法:可以利用数学公式计算1到n的和与实际数组和的差值来找出缺失和重复的数字
-
原地标记:可以在原数组上进行标记(取负数)来标识已访问的数字,无需额外空间
-
LinkedHashMap:当前解法使用了LinkedHashMap,但实际并不需要保持插入顺序,普通HashMap即可
-
提前终止:如果在遍历过程中已经找到重复和缺失的数字,可以提前终止循环