您的位置:首页 > 教育 > 培训 > 广州疫情最新消息今天新增白云区_建筑工程网名_大连今日新闻头条_青岛网站开发公司

广州疫情最新消息今天新增白云区_建筑工程网名_大连今日新闻头条_青岛网站开发公司

2025/3/22 11:57:21 来源:https://blog.csdn.net/Bran_Liu/article/details/145446207  浏览:    关键词:广州疫情最新消息今天新增白云区_建筑工程网名_大连今日新闻头条_青岛网站开发公司
广州疫情最新消息今天新增白云区_建筑工程网名_大连今日新闻头条_青岛网站开发公司

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

文章目录

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

376. 摆动序列

题目链接

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

738. 单调递增的数字

题目链接

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

53. 最大子序和

题目链接

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

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

题目链接

class Solution:def maxProfit(self, prices: List[int]) -> int:res = 0for i in range(1, len(prices)):if prices[i] > prices[i-1]:res += prices[i] - prices[i-1]return res
  • 贪心策略:所有上涨交易日都买卖(赚到所有利润)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com