牛客——贪心算法

本文介绍了三个算法问题的解决方案:1. 分糖果问题,确保每个孩子得到的糖果数不小于其邻居;2. 主持人调度,判断是否存在冲突的活动安排;3. 合并区间,找到不相交的活动区间。这些题目涉及贪心策略和区间处理,有助于提升算法思维能力。
摘要由CSDN通过智能技术生成

1.分糖果问题

在这里插入图片描述
在这里插入图片描述

class Solution:
    def candy(self , arr: List[int]) -> int:
        # write code here
        n=len(arr)
        ans=[1]*n
        for i in range(n-1):
            if arr[i+1]>arr[i]:
                ans[i+1]=ans[i]+1
        for i in range(n-1,0,-1):
            if arr[i-1]>arr[i]  and ans[i-1]<=ans[i]:
                ans[i-1]=ans[i]+1
        return sum(ans)

2.主持人调度(一)

在这里插入图片描述
这道题不是贪心算法,是一道别的,这里就是要找重复的地方,重复了就直接false就可以了,为了好做,就可以按开始时间从小到大排序,然后找一下当前开始时间在别的时间范围之内的就可以了。

class Solution:
    def hostschedule(self , schedule: List[List[int]]) -> bool:
        # write code here
        schedule = sorted(schedule, key = lambda x : x[0], reverse = False)
        for i in range(1, len(schedule)):
            if schedule[i][0] < schedule[i -1][1]:# 当前的开始时间在其他的结束时间之内
                return False
        return True

3.主持人调度(二)

在这里插入图片描述
在这里插入图片描述
没咋看懂,但是就是单独获取了开始和结束时间,然后对n个活动一一遍历,如果开始时间大于现在的结束时间,就可以往后移一下结束时间,如果不满足的话,就需要增加一个主持人。
这个题判断相交的方法比较奇怪,但是有点类似之前的一个逆序对的思想。

class Solution:
    def minmumNumberOfHost(self , n: int, startEnd: List[List[int]]) -> int:
        # write code here
        start = [i[0] for i in startEnd]
        end = [i[1] for i in startEnd]
        start.sort()
        end.sort()
        num, end_time = 0, 0
        for i in range(n):
            if start[i]>=end[end_time]:
                end_time+=1
            else:
                num+=1
        return num

4.合并区间(类似有一天考试的题,找最小不交叉区间)

在这里插入图片描述
在这里插入图片描述

class Solution:
    def merge(self , intervals: List[Interval]) -> List[Interval]:
        # write code here
        if not intervals:
            return []
        intervals.sort(key = lambda x :x.start)
        res = [intervals[0]]
        for i in intervals[1:]:
            if i.start > res[-1].end:
                res.append(i)
            elif i.end >= res[-1].end:
                res[-1].end = i.end
        return res

5.


6.


7.


8.


9.


1.


1.


1.


1.


1.


1.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值