leetcode56&57之合并区间
题目描述:
给出一个区间的集合,请合并所有重叠的区间。
示例:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
代码如下:
1 def merge(intervals): 2 ''' 3 4 :param intervals: 5 :return 6 ''' 7 # 根据区间左端点排序 8 intervals.sort(key=lambda x: x[0]) 9 if intervals: 10 res = [intervals[0]] 11 else: 12 return intervals 13 for i in range(1, len(intervals)): 14 # 可以合并 15 if (intervals[i][-1] - intervals[i][0] + res[-1][-1] - res[-1][0]) \ 16 >= intervals[i][-1] - res[-1][0]: 17 res[-1] = [res[-1][0], max(intervals[i][-1], res[-1][-1])] 18 # 不能合并,将intervals当前值放入res中 19 else: 20 res.append(intervals[i]) 21 22 return res 23 24 25 print('--------测试merge()---------') 26 A = [[1, 2], [0, 6], [7, 9], [10, 18]] 27 B = [] 28 res = merge(B) 29 print("res=", res) 30 31 32 def merge1(intervals): 33 ''' 34 35 :param intervals: 36 :return: 37 ''' 38 intervals.sort(key=lambda x: x[0]) 39 res = [] 40 for item in intervals: 41 # 如果res为空 42 if not res: 43 res.append(item) 44 else: 45 # 可以合并 46 if item[0] <= res[-1][1]: 47 res[-1][1] = max(item[1], res[-1][1]) 48 # 不能合并 49 else: 50 res.append(item) 51 52 return res 53 54 55 print("=============测试merge1()==============") 56 result = merge1(A) 57 print("result=", result)
输出:
--------测试merge()--------- res= [] =============测试merge1()============== result= [[0, 6], [7, 9], [10, 18]]
题目57解答:
1 def insert1(intervals, newInterval): 2 ''' 3 4 :param intervals: 5 :param newInterval: 6 :return: 7 ''' 8 intervals.append(newInterval) 9 intervals.sort(key=lambda x: x[0]) 10 print(intervals) 11 12 def isinterval(interval1, interval2): 13 # 交换大小区间,小区间为interval1,大区间为interval2 14 if interval1[0] > interval2[0]: 15 interval1, interval2 = interval2, interval1 16 17 if interval1[0] <= interval2[0] <= interval1[1]: 18 return True 19 else: 20 return False 21 22 res = [] 23 for item in intervals: 24 if not res: 25 res.append(item) 26 else: 27 if isinterval(res[-1], item): 28 res[-1] = [min(res[-1][0], item[0]), max(res[-1][1], item[1])] 29 else: 30 res.append(item) 31 32 return res 33 34 35 print("----------测试interval()---------") 36 intervals = [[1, 3], [6, 9]] 37 newInterval = [2, 5] 38 res = insert1(intervals, newInterval) 39 print("res=", res)
一点思考:
本题在解答过程中重点考察了二维数组索引求值。另外一点,当遇到循环比较数组(列表)前后两元素数值时,可以定义一个空的列表,用来动态存放数组中另一个待比较元素,这样实现起来更方便。当放入第一个元素时,采用方法二明显更方便一点,值得借鉴。方法一稍显得麻烦一点。
posted on 2020-06-01 22:15 RounieJane 阅读(284) 评论(0) 编辑 收藏 举报