122. 买卖股票的最佳时机 II
思路:关键点是每一次利用峰值来计算【画图好理解一点,就是计算陡坡的值】!每一次累加和的最大! 或者可以这样理解,把利润划分为每天的,如假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!
那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。
class Solution:def maxProfit(self, prices: List[int]) -> int:# 求峰值的一些问题!关键问题就是找出第一个小值的下标if len(prices) == 1 or len(prices) == 0:return 0min_value = min(prices[0],prices[1])count = 0for i in range(0, len(prices) - 1):if i != 0 and prices[i + 1] < prices[i]:count += prices[i] - min_valuemin_value = prices[i + 1]if min_value < prices[-1]:count += prices[-1] - min_valuereturn count
# 贪心算法
class Solution:def maxProfit(self, prices: List[int]) -> int:result = 0for i in range(1, len(prices)):result += max(prices[i] - prices[i - 1], 0)return result
55. 跳跃游戏
思路:问题的核心是将跳几步转化为每次跳跃能覆盖的最大范围!
贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。
class Solution:def canJump(self, nums: List[int]) -> bool:# 进行每次跳跃覆盖的范围if len(nums) == 1:return Trueindex = 0cover = nums[0]while index <= cover:# 更新覆盖范围 只更新比起大的范围cover = max(index + nums[index], cover)index += 1if cover >= len(nums) - 1:return Truereturn False
45. 跳跃游戏 II
思路:问题的核心依旧是找出能覆盖的最大的范围,不过需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖【一轮遍历下来就可以了】
class Solution:def jump(self, nums: List[int]) -> int:# 依旧是使用覆盖范围,不过是一步一步慢慢来的if len(nums) == 1:return 0# 当前覆盖的的最大距离cur_distance = 0# 下一步覆盖的最大距离next_distance = 0# 步数res = 0# 需要使用到下标了for i in range(len(nums)):next_distance = max(i + nums[i], next_distance)if i == cur_distance:res += 1# 更新当前的覆盖距离cur_distance = next_distanceif cur_distance >= len(nums) - 1:return resreturn res