代码随想录第29天|贪心算法

news2025/1/19 16:16:13

基础知识

  • 原理: 选择每一阶段的最优解, 从而达到全局最优解
  • 套路: 无, 只能举反例, 想不出反例则可以尝试用贪心算法

455. 分发饼干

在这里插入图片描述
在这里插入图片描述
思路:

  • 使用贪心策略
    • 每次用大饼干满足大胃口的孩子(用小饼干则会浪费)
    • 或用小饼干满足小胃口的孩子
  • 一定是遍历孩子, 不能遍历饼干, 否则结果不正确
    • 饼干 s = [ 9, 5, 3, 1]
    • 胃口 g = [10, 7, 2, 1]
    • 使用饼干遍历胃口时, 一直不能满足 10, 导致会尝试用5去匹配, 最后结果为 0

请添加图片描述

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end(), greater<int>());//孩子, 降序排列
        sort(s.begin(), s.end(), greater<int>());//饼干
        int index = 0; //饼干索引计数
        int result = 0;
        for (int i = 0; i < g.size(); i++) {
            if (index >= s.size()) break; //饼干用完, 只能返回
            if (g[i] <= s[index]) {
                result++;
                index++; //用下一个饼干匹配
            }
        }
        return result;
    }
};
//自行实现, 不太容易复现
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end(), greater<int>());
        sort(s.begin(), s.end(), greater<int>());
        auto its = s.begin();
        auto itg = g.begin();
        int res = 0;
        while (its != s.end() && itg != g.end()) {
            if ( *its >= *itg) {
                res++;
                its++;
                itg++;                
            } else {
                itg++;
            }
        }
        return res;
    }
};

376. 摆动序列

如果连续数字之间的差严格地在正数负数之间交替,则数字序列称为 摆动序列
第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度
在这里插入图片描述

思路:

  • 对于是否单调或递增, 使用 nums[i - 1] 和 nums[i] 来判断
  • 局部最优: 删除单调坡上的元素

特殊情况:

  • 只有一个元素, 直接返回
  • 只有两个元素的情况, 不相同则返回 2 个
  • 上下坡有平坡

未完全了解去相同元素的方法 , 目前强行去重

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        vector<int> tem;
        for (int i = 0; i < nums.size(); i++) {            
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            tem.push_back(nums[i]);
        }
        nums = tem;

        //元素数量 <= 2
        if (nums.size() == 1) return 1;
        if (nums.size() == 2) {
            return nums[0] != nums[1] ? 2:1;
        }
        
        //需要元素数量 >= 3
        int result = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (i == 0) {
                result++;
                continue;
            }
            if (i == nums.size() - 1) {
                result++;
                continue;
            }
            
            if (nums[i - 1] < nums[i] && nums[i] > nums[i + 1]) {
                result++;//极大值
            } else if (nums[i - 1] > nums[i] && nums[i] < nums[i + 1]) {
                result++;//极小值
            }
        }
        return result;
    }
};

53. 最大子序和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
在这里插入图片描述
题解

思路:

  • 使用 sum 做贪心
    • 若相加后 sum > 0, 则判断最大值的更新
    • 若相机后 sum < 0, 则舍弃该元素, 从下一个元素开始遍历
    • 期间一直更新max的值
    • 累计和为 正数会对值有增加的作用, 需要保留

特例:

  • [-1 -2 -3] 首元素直接特例更新
  • [10 -1 -11 12] 最大[12] 这段
  • [10 -1 -11 2] 最大[10] 这段
  • [10 -1 -8 2] 最大[10 -1 -8 2] 这段
  • 只要 sum >=0 可以继续往下相加, 否则从下一个元素开始
  • 当 sum 可以继续往下相加时, 需要持续更新 max 的值

在这里插入图片描述

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = 0;
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
            res = max(res, sum);

            if (i == 0) res = sum;                    
            if (sum < 0) sum = 0;//从下一个数开始
                        
        }
        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1847860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型时代,新手和程序员如何转型入局AI行业?

在近期的全国两会上&#xff0c;“人工智能”再次被提及&#xff0c;并成为国家战略的焦点。这一举措预示着在接下来的十年到十五年里&#xff0c;人工智能将获得巨大的发展红利。技术革命正在从“互联网”向“人工智能”逐步迈进&#xff0c;我将迎来新一轮技术革新和人才需求…

鸿蒙开发:【组件启动规则(FA模型)】

组件启动规则&#xff08;FA模型&#xff09; 启动组件是指一切启动或连接应用组件的行为&#xff1a; 启动PageAbility、ServiceAbility&#xff0c;如使用startAbility()等相关接口。连接ServiceAbility、DataAbility&#xff0c;如使用connectAbility()、acquireDataAbili…

MySQL之复制(八)

复制 复制和容量规划 备库什么时候开始延迟 一个关于备库比较普遍的问题是如何预测备库会在何时跟不上主库。很难去描述备库使用的复制容量为5%与95%的区别&#xff0c;但是至少能够在接近饱和前预警并估计复制容量。首先应该古纳差复制延迟的尖刺。如果有复制延迟的曲线图&…

如何将现有系统逐步优化成微服务设计

目录 基础服务改造核心步骤准备阶段实施阶段 基础服务设计 本文诞生于学习架构实践专栏后的深思以及总结&#xff0c;结合公司之前“大泥球”的架构风格&#xff0c;改造服务设计的思维。 改造公司系统服务主要原因&#xff1a;1、代码类似“屎山”&#xff0c;牵一发而动全身&…

Freertos-----任务之间的消息传递(使用消息队列信号量方法)

这次来分享任务之间的数据传递的方法&#xff0c;方法有很多种&#xff0c;我展示2种&#xff0c;让大家对freertos有更深刻的印象 目录 消息队列 信号量 消息队列 首先直接打开普中的例程&#xff0c;然后在里面加上ADC的驱动代码&#xff0c;先初始化外设先&#xff0c;我…

亚足联官方公布18强赛抽签时间及规则,国足确认位列第五档,你们觉得国足能进世界杯吗?

亚足联官方公布18强赛抽签时间及规则&#xff0c;国足确认位列第五档&#xff0c;你们觉得国足能进世界杯吗&#xff1f; 今天亚足联官方宣布了世预赛18强赛分组抽签仪式时间&#xff0c;本次抽签仪式将于6月27日15点在马来西亚吉隆坡举行。除了抽签时间之外&#xff0c;足联还…

L55--- 257.二叉树的所有路径(深搜)---Java版

1.题目描述 2.思路 &#xff08;1&#xff09;因为是求二叉树的所有路径 &#xff08;2&#xff09;然后是带固定格式的 所以我们要把每个节点的整数数值换成字符串数值 &#xff08;3&#xff09;首先先考虑根节点&#xff0c;也就是要满足节点不为空 返回递归的形式dfs(根节…

Service方法增加@Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException

Service方法增加Asyn注解后导致bean无法找到 NoSuchBeanDefinitionException 场景处理方法原因 场景 首先确认的是Service添加了Service或Component等注解&#xff0c;另外也增加了ComponentScan确定扫描的包路径是包含对应Service的&#xff0c;但就是无法找到这个bean。 通…

C51与MDK共存版本安装教程

目录 一、安装准备 1.1 新建文件夹 1.2 网盘链接-加Q 667198390 二、 双版本共存安装教程 2.1 安装Keil5 C51 2.2 安装Keil5 MDK 2.3 C51和MDK的共存 2.4 生成许可证 2.5 安装STM32Pack包 一、安装准备 1.1 新建文件夹 如下图&#xff1a; 在合适的网盘里&#xff08…

阿里云如何实现express的自动化部署(保姆级教程)

本篇文章将详细介绍一下阿里云如何实现express的自动化部署&#xff0c;作者本人总结的保姆级教程&#xff01;&#xff01;&#xff01; 首先去阿里云官网 &#xff08;阿里云-计算&#xff0c;为了无法计算的价值) 搜索函数计算fc 如果没有开通过选择免费开通&#xff0c;…

计算机组成原理 | 计算机系统概述

CPI:(Clockcycle Per Instruction)&#xff0c;指每条指令的时钟周期数。 时钟周期&#xff1a;对CPU来说&#xff0c;在一个时钟周期内&#xff0c;CPU仅完成一个最基本的动作。时钟脉冲是计算机的基本工作脉冲&#xff0c;控制着计算机的工作节奏。时钟周期 是一个时钟脉冲所…

【第24章】Vue实战篇之用户信息展示

文章目录 前言一、准备1. 获取用户信息2. 存储用户信息3. 加载用户信息 二、用户信息1.昵称2.头像 三、展示总结 前言 这里我们来展示用户昵称和头像。 一、准备 1. 获取用户信息 export const userInfoService ()>{return request.get(/user/info) }2. 存储用户信息 i…

服装连锁实体店bC一体化运营方案

一、引言 随着互联网的快速发展和消费者购物习惯的变化&#xff0c;传统服装连锁实体店在面对新的市场环境下亟需转型升级。BC&#xff08;Business to Consumer&#xff09;一体化运营方案的实施将成为提升服装连锁实体店竞争力和顾客体验的关键举掖。商淘云详细介绍服装连锁…

深度学习论文: Depth Anything V2

深度学习论文: Depth Anything V2 Depth Anything V2 PDF: https://arxiv.org/pdf/2406.09414v1 代码:https://depth-anything-v2.github.io/ PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://github.com/shanglianlm0525/PyTorch-Networks …

黑神话悟空-吉吉国王版本【抢先版】

在中国的游戏市场中&#xff0c;一款名为“黑神话悟空”的游戏引起了广泛的关注。这款游戏以中国传统的神话故事“西游记”为背景&#xff0c;创造了一个令人震撼的虚拟世界。今天&#xff0c;我们要来介绍的是这款游戏的一种特殊版本&#xff0c;那就是吉吉国王版本。 在吉吉国…

Go微服务: redis分布式锁在集群中可能遇到的问题及其解决方案

概述 我们的 redis 一般都是集群来给我们程序提供服务的&#xff0c;单体的redis现在也不多见 看到上面是主节点redis和下面是6个重节点redis&#xff0c;主节点和重节点的通讯都是畅通没问题的这个时候&#xff0c;我们有 gorouting 写我们的数据&#xff0c;那它就会用到我们…

《沃趣 分手后霸道少爷宠爆我》盛大开机典礼

南京五聚文化传媒有限公司自豪地宣布&#xff0c;引人入胜的2024年度短剧巨作——《沃趣 分手后霸道少爷宠爆我》——今日正式开拍&#xff01;在星辰下的华丽舞台上&#xff0c;我们汇集了业界的精英力量&#xff0c;准备讲述一个关于爱、错位与重生的故事。 典礼精彩亮点 1.…

openh264 宏块级码率控制源码分析

openh264 宏块级码率控制函数关系 宏块级核心函数分析 WelsRcMbInitGom函数 功能&#xff1a;openh264 码率控制框架中宏块级码率控制函数&#xff0c;根据是否启用GOM QP来决定如何设置宏块的QP值&#xff0c;以控制编码的质量和比特率。原理过程&#xff1a; 函数参数&…

高效管理:好用的项目管理工具推荐

在当今快速变化的商业环境中&#xff0c;高效的项目管理工具能够显著提升团队的生产力和项目的成功率&#xff0c;还能有效地跟踪项目进度。所以&#xff0c;一款优秀的项目管理工具首先要具备先进的项目管理理念&#xff0c;支持多种研发管理和项目管理方法论&#xff0c;才能…

“打造智能售货机系统,基于ruoyi微服务版本生成基础代码“

目录 # 开篇 1. 菜单 2. 字典配置 3. 表配置 3.1 导入表 3.2 区域管理 3.3 合作商管理 3.4 点位管理 4. 代码导入 4.1 后端代码生成 4.2 前端代码生成 5. 数据库代码执行 6. 点位管理菜单顺序修改 7. 页面展示 8. 附加设备表 8.1 新增设备管理菜单 8.2 创建字…