leetcode练习(汇总插入区间)

文章目录

      • 题目一:汇总区间
      • 题目二:插入区间

语言:python 工具:jupyuter

题目一:汇总区间

给定一个 无重复元素 的 有序 整数数组 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”

前提条件:给定一个无重复元素的有序整数数组 nums 。

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

举例:输入:[0,1,2,4,5,7]

​ 输出:[‘0->2’, ‘4->5’, ‘7’]

因为:0-2连续,4-5连续,7单独,连续的输出为a->b格式,单独的数字就输出a

​ 输入:[0,2,3,4,6,8,9]

​ 输出:[‘0’, ‘2->4’, ‘6’, ‘8->9’]

根据前提条件nums有两种情况:nums为空,nums不为空

如果nums为空,则返回空列表

如果不为空。进入下面算法

if not nums:
        return []
    res = []

当num不为空时,先定义两个指针start和end,表示区间的起始和结束位置,全都初始化为数组的第一个元素。sum[0]sum[0]

 start, end = nums[0], nums[0]

接下来开始遍历数组,从数组第二个元素开始如果当前元素与结束位置相邻,则将结束位置向后移动一位,否则将当前区间加入答案,并将起始和结束位置更新为当前位置。

举例:输入:[0,1,2,4,5,7]start和end是0,遍历sum[1]=1=end+1,则将end后移一位变成sum[1],当i=3是,sum[3]!=end+1证明这个递增区间结束了。

for i in range(1, len(nums)):
        if nums[i] == end + 1:
            end = nums[i]

于是把这个区间的开头和结尾按a->b的格式放到res中。

res.append(str(start) + "->" + str(end))

当然如果i=6时,这个区间只有一个整数7时,按a的格式放入res中

if start == end:
	res.append(str(start))

当一个区间结束,应将start和end更新为num[i]num[i]

start, end = nums[i], nums[i]

封装以上代码定义一个函数汇总区间函数

def summaryRanges(nums):
    if not nums:
        return []
    res = []
    start, end = nums[0], nums[0]
    for i in range(1, len(nums)):
        if nums[i] == end + 1:
            end = nums[i]
        else:
            if start == end:
                res.append(str(start))
            else:
                res.append(str(start) + "->" + str(end))
            start, end = nums[i], nums[i]
    return res

运行结果:

image-20230525200422122

因为遍历到最后一个元素时,最后一个区间没有被加入答案

if start == end:
    res.append(str(start))
else:
    res.append(str(start) + "->" + str(end))

更新后

def summaryRanges(nums):
    if not nums:
        return []
    res = []
    start, end = nums[0], nums[0]
    for i in range(1, len(nums)):
        if nums[i] == end + 1:
            end = nums[i]
        else:
            if start == end:
                res.append(str(start))
            else:
                res.append(str(start) + "->" + str(end))
            start, end = nums[i], nums[i]
    if start == end:
        res.append(str(start))
    else:
        res.append(str(start) + "->" + str(end))
    return res

image-20230525200801639

题目二:插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]
示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

段代码首先定义一个空列表 res,用于存储合并后的区间列表。然后,从区间列表的第一个区间开始遍历

res=[]
i=0
n=len(intervals)

举例:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]

输出:[[1,5],[6,9]]

首先[1,3]和[2,5]比较,如果intervals最小的数比newlnterval最大的数小则肯定有重叠给的部分。

因为每个区间都是从小到大,intervals第一个元素是最小,newlnterval最后一个元素最小。

找到重叠部分则合并重叠区间。取intervals和newlnterval中最小元素和最大元素分别做新区间的开头和结尾。并将结果加入res

while intervals[i][0] <= newInterval[1]:
     newInterval[0] = min(newInterval[0], intervals[i][0])
     newInterval[1] = max(newInterval[1], intervals[i][1])
res.append(newInterval)

如果当intervals最大的数比newlnterval最小的数大,则肯定没重叠部分

如[6,9]和[2,5],那直接把intervals加入res即可

while intervals[i][1] < newInterval[0]:
	res.append(intervals[i])

封装插入区间的函数

def insert(intervals, newInterval):
    res = []
    i = 0
    n = len(intervals)
    while i < n and intervals[i][1] < newInterval[0]:
        res.append(intervals[i])
        i += 1
    while i < n and intervals[i][0] <= newInterval[1]:
        newInterval[0] = min(newInterval[0], intervals[i][0])
        newInterval[1] = max(newInterval[1], intervals[i][1])
        i += 1
    res.append(newInterval)
    return res

image-20230525203854323

因为遍历到最后一个元素时,最后一个区间没有被加入答案

while i < n:
    res.append(intervals[i])

更新后

def insert(intervals, newInterval):
    res = []
    i = 0
    n = len(intervals)
    while i < n and intervals[i][1] < newInterval[0]:
        res.append(intervals[i])
        i += 1
    while i < n and intervals[i][0] <= newInterval[1]:
        newInterval[0] = min(newInterval[0], intervals[i][0])
        newInterval[1] = max(newInterval[1], intervals[i][1])
        i += 1
    res.append(newInterval)
    while i < n:
    res.append(intervals[i])
    return res

leetcode练习(汇总插入区间)_第1张图片

示例 :

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

输出:[[1,2],[3,10],[12,16]]

ile i < n:
res.append(intervals[i])
return res

示例 :

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]

输出:[[1,2],[3,10],[12,16]]

解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

你可能感兴趣的:(数据结构与算法,leetcode,算法,python,数据结构,推荐算法)