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