leecode-灌溉花园-贪心算法and动态规划

题目

思路1

将花园的灌溉点看作区间,建立一个数组存储这些区间,即数组下标表示左区间,数组存储右区间。

贪心算法,last记录在当前区间中,再选择1个区间未来能到达的最远距离,cur记录当前选择了的区间们的右边距。

当i到达cur的时候,就需要增加选择的区间了。

如果增加了区间,都还停留原地,即走不动了,那就是无法到达终点。即i==last,已经到达最远点。

cpp 复制代码
class Solution:
    def minTaps(self, n: int, ranges: List[int]) -> int:
        right_most = list(range(n+1))
        for i,r in enumerate(ranges):
            #记录每个区间的左右下标
            start = max(0, i - r)
            end = min(n, i + r)
            #将区间的左下标作为i,保存右下标(并合并能被包含的区间)
            right_most[start] = max(right_most[start], end)
        
        last = ans = cur = 0
        for i in range(n):
            last = max(last, right_most[i])#记录能覆盖的最大距离
            if i == cur:
                cur = last 
                ans += 1
            if i == last:
                return -1
        return ans

思路2

动态规划。

先计算出区间。

cpp 复制代码
class Solution:
    def minTaps(self, n: int, ranges: List[int]) -> int:
        #使用dp[i]表示覆盖区间[0,i]所需要的最少区间数目
        #新加入的区间是[startj,endj] 状态转移:dp[k] = min(dp[k], dp[startj]+1)
        intervals = []
        for i,r in enumerate(ranges):
            start = max(0, i-r)
            end = min(n, i+r)  #这个题有个陷阱,虽然花园长n,但是实际上是有n+1个点,因此这个是n
            intervals.append((start, end))
        intervals.sort()

        dp = [inf] * (n+1) #长度为n的花园,有n+1个区间,这里
        dp[0] = 0 #表示从位置0到位置0需要的喷头为0 ,因为还没浇水区间
        for start, end in intervals:
            if dp[start] == inf:
                return -1
            for j in range(start, end+1):
                dp[j] = min(dp[j], dp[start]+1)
        return dp[n]

           
相关推荐
1000世界小札2 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
2601_956121975 小时前
背包基础篇(01、完全、分组、多重、混合)
c++·算法·动态规划
兴通物联科技6 小时前
SMT PCB 微小 DataMatrix 码扫不动问题分析 兴通 XT8601B 600 万像素工业读码器落地实践
大数据·人工智能·单片机·嵌入式硬件·算法·计算机视觉
月华路9 小时前
G1 GC 对数组与大对象(Humongous)的处理
java·jvm·算法
我想走路带风9 小时前
LRU和最长前缀和(计算机网络算法)
计算机网络·算法
M78佐菲9 小时前
Linux学习笔记:进程
linux·笔记·学习·算法
徐小夕10 小时前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
TechLee11 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
月华路13 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法