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”

示例 2:

输入:nums = [0,2,3,4,6,8,9]
输出:[“0”,“2->4”,“6”,“8->9”]
解释:区间范围是:
[0,0] --> “0”
[2,4] --> “2->4”
[6,6] --> “6”
[8,9] --> “8->9”

提示:

  • 0 <= nums.length <= 20
  • -231 <= nums[i] <= 231 - 1
  • nums 中的所有值都 互不相同
  • nums 按升序排列

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.双指针

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        # 设置两个指针分别对应连续数字的开始和结尾
        l,r = 0,1
        # 结果列表
        res = []
        # 当左指针小于总长度,继续遍历
        while l < len(nums):
        	# 设置连续数字的开始字符
            s = str(nums[l])
            i = 0
            # 满足连续数字条件时查找右指针(连续数字结束位置)
            while r < len(nums) and nums[l] == nums[r]-i-1:
                r+=1
                i+=1
        	# 设置连续数字的结束字符
            if (l!=r-1):
                s += "->" + str(nums[r-1])
            # 添加结果到列表
            res.append(s)
            # 让左指针等于右指针,开始下一次遍历
            l = r
            # 右指针+1
            r += 1
        return res

2. 遍历标记区间的开始和结束

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        # 列表长度
        ln = len(nums)
        # 因为l赋值为[nums[0]], 所以需要排除为空的情况
        if ln == 0:
            return []
        l,r = [nums[0]],[]
        # 结果列表
        res = []
        # 遍历, 当遇到断点,将断点前一项添加到r后一项添加到l
        for i in range(ln-1):
            if nums[i] != nums[i+1] - 1:
                l.append(nums[i+1])
                r.append(nums[i])
        # 遍历结束后在r中填上nums最后一个值,这样l中存储的都是开始值,r中都是结束值,并且l和r列表长度不会不等
        r.append(nums[-1])
        # 同时遍历l与r列表
        # while l and r:
        #     ll = str(l.pop(0))
        #     rr = str(r.pop(0))
        #     if ll == rr:
        #         res.append(ll)
        #     else:
        #         res.append(ll + "->" + rr)
        # return res
        return [str(ll) + "->" + str(rr) if ll != rr else str(ll) for ll,rr in zip(l,r)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值