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]

           
相关推荐
沈浩(种子思维作者)40 分钟前
没有错误,正确将一文不值
人工智能·python·算法·量子计算
x_xbx41 分钟前
LeetCode:5. 最长回文子串
算法·leetcode·职场和发展
快手技术44 分钟前
免费报名|生成式推荐技术如何实现体系化演进?快手技术沙龙第四期开启!
算法
初夏睡觉44 分钟前
数字截断求和 题解
算法
AZaLEan__1 小时前
多源 BFS
java·开发语言·算法
smith成长之旅1 小时前
07 | Mem0 框架分析:三路信号融合——语义 + BM25 + Entity Boost 的混合检索
python·算法
wabs6661 小时前
关于贪心算法章节的【有两个维度问题】的自我总结
算法·贪心算法
未若君雅裁1 小时前
算法复杂度与数据结构:Java 集合篇的第一块基石
java·数据结构·算法
春日见2 小时前
五分钟入门 强化学习---Q-Learning算法与实现
人工智能·python·深度学习·算法·机器学习·计算机视觉
Zldaisy3d2 小时前
全球唯一仿真驱动自适应扫描路径新版本发布,金属3D打印工艺开发进入算法时代
算法·3d