[LeetCode][268. 丢失的数字] 4种方法:排序,哈希表,异或,数学
By Long Luo
Leetcode 268. 丢失的数字 的题解,English version is 4 Approaches: Sorting, Hash, XOR, Math 。
方法一:暴力 + 排序
思路与算法
这是一道简单题。首先想到的方法是先进行排序,然后遍历数组,找到值不同的那个数字,如果都相同,那么结果就是 \(len\)。
代码如下所示:1
2
3
4
5
6
7
8
9
10
11public int missingNumber(int[] nums) {
int len = nums.length;
Arrays.sort(nums);
for (int i = 0; i < len; i++) {
if (i != nums[i]) {
return i;
}
}
return len;
}
复杂度分析:
- 时间复杂度:\(O(n \log n)\),其中 \(n\) 是数组 \(\textit{nums}\) 的长度。排序的时间复杂度是 \(O(n \log n)\),遍历数组寻找丢失的数字的时间复杂度是 \(O(n)\),因此总时间复杂度是 \(O(n \log n)\)。
- 空间复杂度:\(O(\log n)\),其中 \(n\) 是数组 \(\textit{nums}\) 的长度。空间复杂度主要取决于排序的递归调用栈空间。
方法二:HashSet
可以使用一个 \(\texttt{HashSet}\) 来记录数组中出现的数,将时间复杂度降低为 \(O(n)\)。
首先遍历数组 \(\textit{nums}\),记录数组中的每个元素,然后检查从 \(0\) 到 \(n\) 的每个整数是否在哈希集合中,不在哈希集合中的数字即为丢失的数字。由于哈希集合的每次添加元素和查找元素的时间复杂度都是 \(O(1)\),因此总时间复杂度是 \(O(n)\)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public static int missingNumber_set(int[] nums) {
int len = nums.length;
Set<Integer> set = new HashSet<>();
for (int i = 0; i < len; i++) {
set.add(nums[i]);
}
for (int i = 0; i <= len; i++) {
if (set.add(i)) {
return i;
}
}
return len;
}
复杂度分析:
- 时间复杂度:\(O(n)\)
- 空间复杂度:\(O(n)\)