Day11,Hot100(贪心算法)

贪心

(1)121. 买卖股票的最佳时机

第 i 天卖出的最大利润,即在前面最低价的时候买入

py 复制代码
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        min_price = prices[0]
        ans = 0

        for price in prices:
            ans = max(ans, price - min_price)
            min_price = min(min_price, price)
        
        return ans

(2)152. 乘积最大子数组 ------ 美团一面

py 复制代码
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        n = len(nums)
        f_max = [0] * n
        f_min = [0] * n
        f_max[0] = f_min[0] = nums[0]

        for i in range(1, n):
            x = nums[i]
            f_max[i] = max(f_max[i-1] * x, f_min[i-1] * x, x)
            f_min[i] = min(f_max[i-1] * x, f_min[i-1] * x, x)

        return max(f_max)

(3)55. 跳跃游戏

  • max_idx[i] 表示 nums[0 : max_idx] 所有元素中可以到达的最远位置
  • 所以只需逐个遍历每个位置, 判断从之前的位置开始跳能否到达该位置
py 复制代码
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        # max_idx[i] 表示 nums[0 : max_idx] 所有元素中可以到达的最远位置
        # 所以只需逐个遍历每个位置, 判断从之前的位置开始跳能否到达该位置
        max_idx = 0  

        for i,v in enumerate(nums):
            if i > max_idx:
                return False
            max_idx = max(max_idx, i + nums[i])

        return True        

(4)45. 跳跃游戏 II

只在无法继续走的时候才建桥,且建的是最远的桥,这是所有方案中最优的。

只遍历到 n-2 因为我们的边界 cur_right,在遍历到 n-2 后,更新后的 cur_right 一定是 > n-2的,所以一定大于等于 n-1

py 复制代码
class Solution:
    def jump(self, nums: List[int]) -> int:
        # 只在无法继续走的时候才建桥,且建的是最远的桥,这是所有方案中最优的。
        ans = 0
        cur_right = 0  # 已构造桥的最远端
        next_right = 0  # 下一座桥的最远端

        for i in range(len(nums) - 1):
            next_right = max(next_right, i + nums[i])
            if cur_right == i:
                cur_right = next_right
                ans += 1
        
        return ans

(5)763. 划分字母区间

「同一字母最多出现在一个片段中」

意味着,一个片段若要包含字母 a,那么所有的字母 a 都必须在这个片段中

利用合并区间的思想,s = a b a b c b a c a d e f e g d e h i j h k l i j

  • a出现的区间为 [0,8]
  • b出现的区间为 [1,5]
  • c 出现的区间为 [4,7]

结合<45. 跳跃游戏 II>的思路,

  • 区间右端点相当于当前点能到达的最远位置,
  • 如果这个最远的位置都被前面最远区间的最远位置包含住了
  • 那么这两个区间需要合并为一个区间

end = i 时,说明从 strat 到 当前位置 i 中的所有元素的最远区间就是当前位置

所以把当前位置划分为一个区间

py 复制代码
class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last = {v:i for i,v in enumerate(s)}  # 每个字母最后出现的位置
        
        start = end = 0
        ans = []

        for i,v in enumerate(s):
            end = max(end, last[v])
            if end == i:
                ans.append(end-start+1)
                start = i + 1
        
        return ans
相关推荐
2401_858286117 分钟前
CD21.【C++ Dev】类和对象(12) 流插入运算符的重载
开发语言·c++·算法·类和对象·运算符重载
梭七y29 分钟前
【力扣hot100题】(033)合并K个升序链表
算法·leetcode·链表
月亮被咬碎成星星33 分钟前
LeetCode[383]赎金信
算法·leetcode
无难事者若执1 小时前
新手村:逻辑回归-理解03:逻辑回归中的最大似然函数
算法·机器学习·逻辑回归
IT从业者张某某1 小时前
机器学习-04-分类算法-03KNN算法案例
算法·机器学习·分类
chen_song_1 小时前
WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试
算法·音视频·webrtc·交互·媒体
蒙奇D索大2 小时前
【数据结构】图解图论:度、路径、连通性,五大概念一网打尽
数据结构·考研·算法·图论·改行学it
uhakadotcom2 小时前
2025年春招:如何使用DeepSeek + 豆包优化简历,轻松敲开心仪公司的大门
算法·面试·github
小白狮ww2 小时前
Retinex 算法 + MATLAB 软件,高效率完成图像去雾处理
开发语言·人工智能·算法·matlab·自然语言处理·图像识别·去雾处理
trust Tomorrow3 小时前
每日一题-力扣-2278. 字母在字符串中的百分比 0331
算法·leetcode