Easy
题目描述
给你一个由唯一整数组成的整数数组 nums。
最初,nums 包含某个范围内的所有整数。然而,数组中可能缺失了一些整数。
原始范围的最小和最大整数仍然存在于 nums 中。
返回该范围内所有缺失整数的有序列表。如果没有缺失的整数,返回空列表。
示例 1:
输入:nums = [1,4,2,5]
输出:[3]
解释:
最小整数是 1,最大整数是 5,所以完整范围应该是 [1,2,3,4,5]。其中只有 3 缺失。
示例 2:
输入:nums = [7,8,6,9]
输出:[]
解释:
最小整数是 6,最大整数是 9,所以完整范围是 [6,7,8,9]。所有整数都已存在,所以没有缺失的整数。
示例 3:
输入:nums = [5,1]
输出:[2,3,4]
解释:
最小整数是 1,最大整数是 5,所以完整范围应该是 [1,2,3,4,5]。缺失的整数是 2、3 和 4。
约束条件:
2 <= nums.length <= 1001 <= nums[i] <= 100
解题思路
这道题要求找出数组中缺失的元素,核心思路是:
确定范围:首先找到数组中的最小值和最大值,这两个值确定了应该包含的完整范围。
解法一:哈希表查找(推荐)
- 将数组中的所有元素放入哈希集合中,实现O(1)查找
- 遍历[min, max]范围内的每个数字,检查是否在哈希集合中
- 不存在的数字就是缺失的元素
解法二:数组标记
- 创建一个布尔数组标记哪些数字存在
- 遍历原数组标记存在的元素
- 再次遍历找出未标记的元素
解法三:排序后比较
- 先排序数组,然后逐一比较相邻元素
- 如果相邻元素差值大于1,说明中间有缺失
哈希表解法在时间和空间复杂度上都比较优秀,且代码简洁易懂,是最推荐的解法。
代码实现
class Solution {
public:
vector<int> findMissingElements(vector<int>& nums) {
int minVal = *min_element(nums.begin(), nums.end());
int maxVal = *max_element(nums.begin(), nums.end());
unordered_set<int> numSet(nums.begin(), nums.end());
vector<int> result;
for (int i = minVal; i <= maxVal; i++) {
if (numSet.find(i) == numSet.end()) {
result.push_back(i);
}
}
return result;
}
};
class Solution:
def findMissingElements(self, nums: List[int]) -> List[int]:
min_val = min(nums)
max_val = max(nums)
num_set = set(nums)
result = []
for i in range(min_val, max_val + 1):
if i not in num_set:
result.append(i)
return result
public class Solution {
public IList<int> FindMissingElements(int[] nums) {
int minVal = nums.Min();
int maxVal = nums.Max();
HashSet<int> numSet = new HashSet<int>(nums);
List<int> result = new List<int>();
for (int i = minVal; i <= maxVal; i++) {
if (!numSet.Contains(i)) {
result.Add(i);
}
}
return result;
}
}
var findMissingElements = function(nums) {
const minVal = Math.min(...nums);
const maxVal = Math.max(...nums);
const numSet = new Set(nums);
const result = [];
for (let i = minVal; i <= maxVal; i++) {
if (!numSet.has(i)) {
result.push(i);
}
}
return result;
};
复杂度分析
| 复杂度类型 | 哈希表解法 |
|---|---|
| 时间复杂度 | O(n + k),其中 n 是数组长度,k 是范围大小 |
| 空间复杂度 | O(n),用于存储哈希集合 |