LeetCode第163题_缺失的区间

LeetCode 第163题:缺失的区间

题目描述

给定一个排序的整数数组 nums,其中元素的范围在闭区间 [lower, upper] 内,返回不包含在数组中的区间范围的列表。

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 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的区间。
关键点:

  1. 处理lower到数组第一个元素之间的区间
  2. 处理数组相邻元素之间的区间
  3. 处理数组最后一个元素到upper之间的区间
  4. 考虑边界情况,如空数组、溢出等

时间复杂度: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 ms38.2 MB实现简洁,性能适中
Python36 ms15.1 MB代码最简洁
C++4 ms6.8 MB性能最优

补充说明

代码亮点

  1. 统一处理边界和内部区间,简化代码逻辑
  2. 使用long类型避免整数溢出
  3. 使用辅助函数生成格式化的区间字符串

常见错误

  1. 没有考虑整数溢出(如果lower或upper接近整数边界)
  2. 没有正确处理空数组的情况
  3. 没有处理lower与nums[0]之间或nums[最后一个]与upper之间的区间

相关题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值