【Leetcode每日一题】57. 插入区间(区间标记)

Leetcode 每日一题
题目链接: 57. 插入区间
难度: 困难
解题思路: 设置标记数组,对区间进行染色标记,最后统一处理。不算难题,但中间有很多细节需要处理。具体看代码。
题解:

class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        # 显然情况
        if len(intervals) == 0:
            return [newInterval]
        if len(newInterval) == 0:
            return intervals
        # intervals 和newInterval 相同
        if len(intervals) == 1 and (intervals[0][0] == intervals[0][1]) and (newInterval[0] == newInterval[1]) and (intervals[0][0] == newInterval[1]):
            return intervals
		
		# 整个区间左右端点
        len_max = max((intervals[-1][-1]), newInterval[-1]) + 1
        len_min = min((intervals[0][0]), newInterval[0])

		# 标记数组
        visit = [0] * max((len_max - len_min), len_max)

		#打标记
        for example in intervals:
            # 赋值为-1解决左右端点相同问题
            if example[0] == example[1]:
                visit[example[0]] = -1
            else:
                for i in range(example[0], example[1]):
                    visit[i] = 1
            

        # 赋值为-1解决左右端点相同问题
        if newInterval[0] == newInterval[1] and (visit[newInterval[0]] == 0 and visit[newInterval[0] - 1] == 0):
            visit[newInterval[0]] = -1
        else:
            for i in range(newInterval[0], newInterval[1]):
                visit[i] = 1
        


        # print(visit)
        begin, end = len_min, len_min
        res = []
        for i in range(len_min, len_max - 1):
            # 出现在首位
            if (visit[i] == -1 and i == len_min):
                res.append([i, i])
            # 左右端点相同
            if ((visit[i] == 0 or visit[i] == -1)and visit[i + 1] == -1):
                res.append([i + 1, i + 1])
            if (visit[i] == 0 or visit[i] == -1) and visit[i + 1] == 1:
                begin = i + 1
            if visit[i] == 1 and (visit[i + 1] == 0 or visit[i + 1] == -1):
                end = i + 1
                res.append([begin, end])
        

        return res
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值