当前位置: 首页 > article >正文

✅DAY27贪心算法 | 455.分发饼干 | 376. 摆动序列 | 53. 最大子序和

一、贪心算法

核心理念是每一步都做出局部最优选择,以期最终得到全局最优解。它通常用于求解一些最优化问题,例如最小生成树、最短路径、背包问题等。

二、贪心算法的步骤

1. 定义选择标准:确定每一步如何选择当前最优解。

2. 验证贪心策略的正确性:分析问题是否满足贪心算法的条件,确保贪心选择可以得到最优解。

3. 迭代选择:从初始状态开始,每一步按照选择标准做出决策,直到找到问题的完整解决方案。

三、贪心算法的优缺点

优点:

简单且高效:贪心算法通常实现简单,运行速度较快。

适用性强:适用于许多最优化问题,例如图算法中的最小生成树和最短路径。

缺点:

不保证全局最优解:并非所有问题都能通过贪心算法获得最优解。尤其是涉及多个约束条件的复杂问题,贪心选择可能导致非最优解。

适用场景有限:只有当问题满足最优子结构和无后效性时,贪心算法才能得到全局最优解。

455. 分发饼干

解题思路:需要找出有几个满足饼干>小孩,尽量用大的饼干满足较大的小孩

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()  # 小孩的胃口
        s.sort()  # 饼干的大小
        index = len(s) - 1  # 从最后一个饼干开始
        result = 0
        # 从胃口最大的孩子开始遍历
        for i in range(len(g) - 1, -1, -1):
            # 如果当前饼干满足孩子的胃口,分配饼干并记录结果
            if index >= 0 and s[index] >= g[i]:
                result += 1
                index -= 1  # 使用掉一个饼干,向前移动
        return result

解题思路:就从小到大尝试,满足则把小孩的index+1,最后返回index

class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        index = 0
        for i in range(len(s)):
            if index < len(g) and g[index] <= s[i]:
                index += 1
        return index

376. 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。

解题思路:保留峰值,把单调坡上的中间元素删除

计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果prediff < 0 && curdiff > 0 或者 prediff > 0 && curdiff < 0 此时就有波动就需要统计。

本题要考虑三种情况:

  1. 情况一:上下坡中有平坡
  2. 情况二:数组首尾两端
  3. 情况三:单调坡中有平坡
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        if len(nums) <= 1: 
            return len(nums)
        
        curDiff, preDiff = 0, 0
        result = 1  # 记录峰值个数
        
        for i in range(len(nums) - 1):
            curDiff = nums[i + 1] - nums[i]
            # 检查摆动峰值
            if (preDiff <= 0 and curDiff > 0) or (preDiff >= 0 and curDiff < 0):
                result += 1
                preDiff = curDiff
        
        return result

53. 最大子数组和

暴力递归

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        result = float('-inf')
        count = 0
        for i in range(len(nums)):
            count = 0
            for j in range(i, len(nums)):
                count += nums[j]
                result = max(result, count)
        return result

贪心:遇到和为负数时,就重置,重新开始计算下个区间和

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum = nums[0]
        current_sum = 0

        for num in nums:
            if current_sum < 0:
                current_sum = 0
            current_sum += num
            max_sum = max(current_sum, max_sum)

        return max_sum


http://www.kler.cn/a/399675.html

相关文章:

  • Thrift与NestJS:构建高性能分布式系统的实战指南
  • C++中的桥接模式
  • 使用YOLOv9进行图像与视频检测
  • 任意文件下载漏洞
  • 【MQTT.fx 客户端接入 阿里云平台信息配置】
  • Oracle 19c PDB克隆后出现Warning: PDB altered with errors受限模式处理
  • 认证鉴权框架SpringSecurity-6--6.x版本升级篇
  • IQ Offset之工厂实例分析
  • 一文简单了解Android中的input流程
  • QT5.14*解决QSslSocket::connectToHostEncrypted: TLS initialization faile
  • 网络常用特殊地址-127.0.0.1
  • SRP 实现 Cook-Torrance BRDF
  • 网络物理隔离技术
  • 一文了解清楚oracle数据库undo表空间
  • 前端人之网络通信概述
  • 重构Action-cli前端脚手架
  • 【jvm】如何判断一个对象是否可以回收
  • 力扣经典面试题
  • 【原创】java+ssm+mysql商品库存管理系统(进销存)设计与实现
  • Springboot如何打包部署服务器
  • matlab的函数名和函数文件名的关系(编程注意事项)
  • 深入解析 Vue 3 中的 watch 和 watchEffect
  • 基于Lora通讯加STM32空气质量检测WIFI通讯
  • 一个简单的图像分类项目(九)并行训练的学习:多GPU的DP(DataParallel数据并行)
  • 删除缓存之后,浏览器显示登录新设备
  • 【Linux】进程字段、环境变量与进程地址空间