算法题 - 不重叠线段 - Python

189 篇文章 3 订阅

问题描述:

不重叠线段问题

在一个数轴上,有很多线段,对应着坐标轴上的两点ab,要获取任意两点线段都不重叠(端点是可以重叠)的情况下,最多可以选出多少段来? 其实和电视台排节目一个类型。

测试用例:
输入:

3  # 线段数,下面是各种线段(a, b)
6 3  # 特别注意,a 可能大于 b。估计是为了增加题目的复杂度吧哈
1 3
2 5

输出:

2

问题分析:

(1)先把数据整理一下,使a < b
(2)贪心思想解决,以 线段末尾点b为关键字,进行排序。
(3)以第一个线段为开始,如果后续的线段的开始点,大于等于 前一个线段的结束点,则 计算器加一,并更新,新的末尾点。依次遍历结束。

Python3实现:

# @Time   :2018/09/15
# @Author :LiuYinxing
# 贪心思想,2018爱奇艺秋招


if __name__ == '__main__':

    n = int(input())  # 输入数据
    data = []
    for case in range(n):
        a, b = map(int, input().split())
        if a < b:
            data.append([a, b])
        else:
            data.append([b, a])

    data = sorted(data, key=lambda x: x[1])  # 排序

    cnt = 1
    tmp = data[0][1]
    for v in data:  # 扫描计算
        if tmp <= v[0]:
            cnt += 1
            tmp = v[1]
    print(cnt)  # 输出结果

声明: 总结学习,有问题可以批评指正,大神可以略过哦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值