228 汇总区间

博客围绕LeetCode 228题汇总区间展开。给定无重复元素的有序整数数组,需返回恰好覆盖数组所有数字的最小有序区间范围列表。介绍了两种解法,一是根据入参长度分情况处理,二是用额外数组存分组数据,再格式化追加到结果列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

228. 汇总区间

给定一个无重复元素的有序整数数组 nums

返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x

列表中的每个区间范围 [a,b]应该按如下格式输出:

"a->b",如果 a != b
"a" ,如果 a == b

示例 1:

输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
解释:区间范围是:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"

第一种解法

根据入参长度分三种情况:
长度0 返回空
长度1 返回一个
长度1+ 记录start, end, 当前value-end <= 1 认为是有效的 修改end值, 反之进行追加, 如果是最后一个元素 则直接进行追加

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        length = len(nums)
        if length == 0: return []
        if length == 1: return ["{}".format(nums[0])]
        start = end = None
        res = []
        for i in range(length):
            cur = nums[i]
            if i == 0:
                start = end = cur
            elif cur - end <= 1:
                end = cur
            else:
                if start == end:
                    res.append("{}".format(start))
                else:
                    res.append("{}->{}".format(start, end))
                start = end = cur
            if i == length - 1:
                if start == end:
                    res.append("{}".format(start))
                else:
                    res.append("{}->{}".format(start, end))
        return res
第二种

用额外一个数组来存 分组的数据, 进而对分好组的数据 进行格式化, 追加至 结果列表

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        if len(nums) == 0:
            return []
        pre = nums.pop(0)
        res = []
        subRes = [pre]
        while len(nums) > 0:
            cur = nums.pop(0)
            if abs(cur-pre) <= 1:
                subRes.append(cur)
            else:
                res.append(subRes)
                subRes = [cur]
            if len(nums) == 0:
                res.append(subRes)
                break
            pre = cur
        result = []
        if len(res) == 0:
            return ["{}".format(pre)]
        else:
            while len(res) > 0:
                cur = res.pop(0)
                start = cur[0]
                end = cur[-1]
                if start == end:
                    result.append("{}".format(start))
                else:
                    result.append("{}->{}".format(start, end))
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值