LeetCode 第163题:缺失的区间
题目描述
给定一个排序的整数数组 nums
,其中元素的范围在闭区间 [lower, upper]
内,返回不包含在数组中的区间范围的列表。
难度
简单
题目链接
示例
示例 1:
输入: nums = [0, 1, 3, 50, 75], lower = 0, upper = 99
输出: ["2", "4->49", "51->74", "76->99"]
示例 2:
输入: nums = [], lower = 1, upper = 1
输出: ["1"]
示例 3:
输入: nums = [], lower = -3, upper = -1
输出: ["-3->-1"]
示例 4:
输入: nums = [-1], lower = -1, upper = -1
输出: []
示例 5:
输入: nums = [-1], lower = -2, upper = -1
输出: ["-2"]
提示
-10^9 <= lower <= upper <= 10^9
0 <= nums.length <= 100
lower <= nums[i] <= upper
- 所有的数字都不重复
- 数组中的所有数字都已按升序排序
解题思路
方法:遍历
遍历数组,比较相邻数字之间的差值,如果差值大于1,说明中间有缺失的区间。同时需要考虑lower到第一个数的区间以及最后一个数到upper的区间。
关键点:
- 处理lower到数组第一个元素之间的区间
- 处理数组相邻元素之间的区间
- 处理数组最后一个元素到upper之间的区间
- 考虑边界情况,如空数组、溢出等
时间复杂度:O(n),其中n是数组长度。
空间复杂度:O(1),不考虑输出结果的空间占用。
代码实现
C# 实现
public class Solution {
public IList<string> FindMissingRanges(int[] nums, int lower, int upper) {
List<string> result = new List<string>();
long prev = (long)lower - 1; // 使用long避免整数溢出
for (int i = 0; i <= nums.Length; i++) {
long curr = (i < nums.Length) ? nums[i] : (long)upper + 1;
if (prev + 1 <= curr - 1) {
result.Add(FormatRange(prev + 1, curr - 1));
}
prev = curr;
}
return result;
}
private string FormatRange(long start, long end) {
return start == end ? start.ToString() : start + "->" + end;
}
}
Python 实现
class Solution:
def findMissingRanges(self, nums: List[int], lower: int, upper: int) -> List[str]:
result = []
prev = lower - 1
for i in range(len(nums) + 1):
curr = nums[i] if i < len(nums) else upper + 1
if prev + 1 <= curr - 1:
result.append(self.format_range(prev + 1, curr - 1))
prev = curr
return result
def format_range(self, start, end):
return str(start) if start == end else f"{start}->{end}"
C++ 实现
class Solution {
public:
vector<string> findMissingRanges(vector<int>& nums, int lower, int upper) {
vector<string> result;
long prev = (long)lower - 1; // 使用long避免整数溢出
for (int i = 0; i <= nums.size(); i++) {
long curr = (i < nums.size()) ? nums[i] : (long)upper + 1;
if (prev + 1 <= curr - 1) {
result.push_back(formatRange(prev + 1, curr - 1));
}
prev = curr;
}
return result;
}
private:
string formatRange(long start, long end) {
return start == end ? to_string(start) : to_string(start) + "->" + to_string(end);
}
};
性能分析
各语言实现的性能对比:
实现语言 | 执行用时 | 内存消耗 | 特点 |
---|---|---|---|
C# | 92 ms | 38.2 MB | 实现简洁,性能适中 |
Python | 36 ms | 15.1 MB | 代码最简洁 |
C++ | 4 ms | 6.8 MB | 性能最优 |
补充说明
代码亮点
- 统一处理边界和内部区间,简化代码逻辑
- 使用long类型避免整数溢出
- 使用辅助函数生成格式化的区间字符串
常见错误
- 没有考虑整数溢出(如果lower或upper接近整数边界)
- 没有正确处理空数组的情况
- 没有处理lower与nums[0]之间或nums[最后一个]与upper之间的区间