【LeetCode 刷题】贪心算法(3)-序列问题

此博客为《代码随想录》二叉树章节的学习笔记,主要内容为贪心算法序列问题的相关题目解析。

文章目录

  • [376. 摆动序列](#376. 摆动序列)
  • [738. 单调递增的数字](#738. 单调递增的数字)
  • [53. 最大子序和](#53. 最大子序和)
  • [122. 买卖股票的最佳时机 II](#122. 买卖股票的最佳时机 II)

376. 摆动序列

题目链接

python 复制代码
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        n = len(nums)
        if n < 2: 
            return n
        trend = 0  # 记录之前的趋势 1 上升 -1 下降
        res = 1
        for i in range(1, n):
            if (trend == 0 or trend == 1) and nums[i] < nums[i-1]:
                trend = -1
                res += 1
            elif (trend == 0 or trend == -1) and nums[i] > nums[i-1]:
                trend = 1
                res += 1
        return res
  • 贪心思路:仅统计趋势变换的次数,使用 trend 变量记录之前的趋势,如果当前元素趋势更改,则更新 trend 和答案
  • 根据题目定义,末尾元素默认算一次摆动,因此 res 初始化为 1

738. 单调递增的数字

题目链接

python 复制代码
class Solution:
    def monotoneIncreasingDigits(self, n: int) -> int:
        if n <= 9:
            return n
        digits = [int(i) for i in list(str(n))]
        n = len(digits)
        flag = n  # 记录从哪一位开始变成 9 
        for i in range(n - 1, 0, -1):
            if digits[i] < digits[i-1]:
                flag = i
                digits[i - 1] -= 1
        digits[flag:] = [9] * (n - flag)
        res = 0
        for num in digits:
            res = res * 10 + num
        return res
  • 从后向前遍历,每当遇到 digits[i] < digits[i-1],则表示 i 位置之后都需要变成 9;注意并不是只是将 i 位置变成 9,考虑例子 100,只修改 i 位置得到的答案为 90。
  • 使用 flag 进行记录,等遍历完毕后统一进行更改

53. 最大子序和

题目链接

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res = -inf
        min_pre_sum, pre_sum = 0, 0
        for n in nums:
            pre_sum += n
            res = max(res, pre_sum - min_pre_sum)
            min_pre_sum = min(min_pre_sum, pre_sum)
        return res
  • 维护最小前缀和,用"当前前缀和 - 最小前缀和",得到以当前元素为结尾的最大子序列和
  • 更常用解法为动态规划

122. 买卖股票的最佳时机 II

题目链接

python 复制代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        res = 0
        for i in range(1, len(prices)):
            if prices[i] > prices[i-1]:
                res += prices[i] - prices[i-1]
        return res
  • 贪心策略:所有上涨交易日都买卖(赚到所有利润)
相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
你撅嘴真丑6 小时前
第九章-数字三角形
算法
uesowys6 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder6 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮6 小时前
AI 视觉连载1:像素
算法
智驱力人工智能7 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
孞㐑¥7 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
八零后琐话7 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
月挽清风7 小时前
代码随想录第十五天
数据结构·算法·leetcode