lintcode 30 Insert Interval
2018-03-28 11:20
274 查看
30 | Insert Interval | 合并区间,没交叉时加本身,有交叉时左比右,右比左 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Feb 8 23:58:16 2018 @author: vicky """ #思路:首先要找到newInterval在已有数组中的位置。有三种可能: # #1.newInterval与已有数组没有交集,位于数组最左端,即left_index=0,right_index=-1。此时直接将newInterval插入到数组头部即可。 #2.newInterval与已有数组没有交集,位于数组最右端,即left_index=-1。此时直接将newInterval插入到数组尾部即可。 #3.newInterval与已有数组有交集,这是最普遍的一种情况。newInterval可能是和数组中已有的一个interval有交集,也有可能是跨了几个interval。 # 此时left_index表示数组中右值>=newInterval的左值的最大的interval(约定在数轴上越靠右的interval最大), # 而right_index表示数组中左值<=newInterval的右值的最小的interval,这样就能界定出newInterval影响的数组范围。 # 凡是在影响范围之外的数组部分,直接原样加入到结果数组中即可。 # 而在影响范围之内的数组部分,需要和newInterval合成一个单独的interval(即代码中的add_interval),然后加入到结果数组中。 # Definition for an interval. class Interval: def __init__(self, s=0, e=0): self.start = s self.end = e class Solution: def insert(self, intervals, newInterval): """ :type intervals: List[Interval] :type newInterval: Interval :rtype: List[Interval] """ l=list() a=newInterval.start b=newInterval.end k=0 #注意拿newInterval的左端点跟intervals的右端点比,而不是左端点,这样才能判断是不是有交叉 for k in range(len(intervals)): if a<=intervals[k].end:#当newInterval的左区间在intervals[k]内时,动态更新左端点 a=min(a,intervals[k].start) if b>=intervals[k].start: #或 newInterval的右区间在intervals[k]内时,动态更新右端点 b=max(b,intervals[k].end) elif b<intervals[k].start: #当newInterval的右区间在intervals[k]外(左边)时,停止更新右端点 k=k-1 #要-1因为要包括本来这第k个区间 break else: #当newInterval完全在intervals[k]右边时,则先加intervals[k],再加newInterval l.append(intervals[k]) l.append(Interval(a,b)) #加上与交叉区间对比更新过后的区间[a,b] #当newInterval完全在intervals[k]左边时,则加的是newInterval自己 l=l+intervals[k+1:] #intervals[k+1:]表示从k+1之后的所有区间,多区间时注意不能用append了,list合并直接用加号 #记得给k初始值赋为0,因为存在边界条件intervals=[] # for k in range(len(l)): # print(l[k].start,l[k].end) return l intervals=[Interval(1,5)] #intervals[0].start=1 newInterval=Interval(2,3) print(Solution().insert(intervals, newInterval)) #用while时写法略不同 class Solution: # @param intervals, a list of Intervals # @param newInterval, a Interval # @return a list of Interval def insert(self, intervals, newInterval): start = newInterval.start end = newInterval.end result = [] i = 0 while i < len(intervals): if start <= intervals[i].end: if end < intervals[i].start: break start = min(start, intervals[i].start) end = max(end, intervals[i].end) else: result.append(intervals[i]) i += 1 #注意有i+1 result.append(Interval(start, end)) result += intervals[i:] return result
相关文章推荐
- LintCode 30:Insert Interval
- Lintcode_30 Insert Interval
- 【简单】Lintcode 30:Insert Interval
- lintcode-easy-Insert Interval
- leetcode || 57、Insert Interval
- Java for LeetCode 057 Insert Interval
- [LeetCode] Insert Interval
- LeetCode Insert Interval
- 57. Insert Interval
- leetcode之Insert Interval 问题
- [每日一题] OCP1z0-047 :2013-08-10 INTERVAL DAY TO SECOND........................................30
- FTPrep, 57 Insert interval
- Leetcode: Merge/Insert Interval
- leetcode之Insert Interval
- 插入时间段 Insert Interval
- Insert Interval
- 31_leetcode_ Insert Interval
- Insert Interval & *Regular Expression Matching & Binary Tree Maximum Path Sum
- 57. Insert Interval
- 57. Insert Interval