代码随想录算法训练营第31天(贪心算法01 | ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

news2024/10/7 14:27:48

贪心算法01

  • 理论基础
  • 455.分发饼干
    • 解题思路
  • 376. 摆动序列
    • 解题思路
    • 拓展
  • 53. 最大子序和
    • 解题思路
    • 常见误区
    • 注意点

贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。
不用花心思去研究其规律, 没有思路就立刻看题解。
基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。
学完贪心之后再去看动态规划,就会了解贪心和动规的区别。

理论基础

理论基础

455.分发饼干

题目链接: 455.分发饼干
文章讲解/视频讲解: 455.分发饼干

解题思路

这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。
可以尝试使用贪心策略,先将饼干数组和小孩数组排序。
然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。
在这里插入图片描述

// 贪心  优先考虑胃口,先喂饱胃口大的
class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int result = 0;
        int index = s.length - 1;
        for(int i = g.length - 1; i >=0; i--) {// 必须要先遍历饼干
            if(index >= 0 && s[index] >= g[i]){ // 遍历孩子
                index--;
                result++;
            }
        }
        return result;
    }
}
// 贪心  小饼干先喂饱小胃口
// 贪心  先遍历的饼干,再遍历的胃口,这是因为遍历顺序变了,我们是从小到大遍历。
class Solution {
    // 思路1:优先考虑饼干,小饼干先喂饱小胃口
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int start = 0;
        int count = 0;
        for (int i = 0; i < s.length && start < g.length; i++) {
            if (s[i] >= g[start]) {
                start++;
                count++;
            }
        }
        return count;
    }
}

376. 摆动序列

题目链接: 376. 摆动序列
文章讲解/视频讲解: 376. 摆动序列

解题思路

实际操作上,其实连删除的操作都不用做,因为题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了(相当于是删除单一坡度上的节点,然后统计长度)
本题要考虑三种情况:

  1. 情况一:上下坡中有平坡
    统一规则,删除左边的三个 2
    所以我们记录峰值的条件应该是: (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0),
    在这里插入图片描述

  2. 情况二:数组首尾两端
    如果只有两个不同的元素,那摆动序列也是 2。
    例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。
    因为我们在计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i])的时候,至少需要三个数字才能计算,而数组只有两个数字。
    可以假设,数组最前面还有一个数字
    在这里插入图片描述

  3. 情况三:单调坡中有平坡
    如果只考虑前两种情况,那么我们在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。
    之所以会出问题,是因为我们实时更新了 prediff。
    那么我们应该将更新 prediff的代码包括进if中
    我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。
    在这里插入图片描述

拓展

用动态规划来做,还没看,代码随想录上有,后面再看

// 贪心
class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length <= 1){
            return nums.length;
        }
        int preDiff = 0;
        int curDiff = 0;
        int count = 1;  // 最后一个元素算一个
        for(int i = 1; i < nums.length; i++){
            curDiff = nums[i] - nums[i-1];
            if((preDiff>=0 && curDiff<0) || (preDiff<=0 && curDiff>0)){
                count++;
                preDiff = curDiff;
            }
        }
        return count;  
    }
}

53. 最大子序和

题目链接: 53. 最大子序和
文章讲解/视频讲解: 53. 最大子序和

解题思路

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
全局最优:选取最大“连续和”。

常见误区

== Integer.MIN_VALUE问题==
sum和sumMax 要初始化为最小负数。
要设为intsum = Integer.MIN_VALUE;
因为如果输入用例都是-1,或者 都是负数,假设都是-1的情况下,正确结果应该是-1,
int sum = Integer.MIN_VALUE,这个贪心算法跑出来的结果是 -1,结果正确
而若int sum = 0,这个贪心算法跑出来的结果是 0,结果错误
更新起始位置的条件
前面元素的连续和为负数,我们才更新sum=0,从当前元素重新开始累加。(即 我们要看前面那些元素的累加和对我们当前这个元素有没有贡献)
不必担心更新过程sumMax记录的值不是最大值,因为sumMax是和sum实时比较更新的。

注意点

Integer.MIN_VALUE问题
要设为int sum = Integer.MIN_VALUE;
设为int sum = 0;有些测试案例通不过

// 贪心
class Solution {
    public int maxSubArray(int[] nums) {
        if(nums.length == 1){
            return nums[0];
        }
        int sumMax = Integer.MIN_VALUE;
        int sum = Integer.MIN_VALUE;
        for(int i = 0; i< nums.length; i++){           
            if(sum < 0){
                sum = 0;
            }
            sum += nums[i];
            sumMax = Math.max(sum, sumMax);
        }
        return sumMax;
    }
}

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

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

相关文章

mysql入门到精通002--基础篇

1、基础篇课程内容 2、MySQL概述 2.1 数据库相关概念 2.1.1、数据库 存储数据的仓库 2.1.2、SQL 操作关系型数据库的一套标准语言&#xff0c;定义了一套关系型数据库的统一标准。 2.1.3、关系型数据库管理系统 2.2 mysql数据库 2.2.1 安装与使用 下载地址&#xff1a;…

婴幼儿营养之道:新生儿补充磷脂酰丝氨酸的关键

引言&#xff1a; 磷脂酰丝氨酸是一种对于新生儿神经系统发育和整体健康至关重要的成分。在新生儿成长的早期阶段&#xff0c;科学合理的补充磷脂酰丝氨酸有助于促进大脑和神经系统的发育&#xff0c;为宝宝的智力和身体健康奠定坚实基础。本文将深入探讨磷脂酰丝氨酸的作用、…

24.1.25 DAY2 C++

思维导图&#xff1a; 2.题目&#xff1a; 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周…

Android串口通讯 报错 NO_READ_WRITE_PERMISSION

在调试Android串口通讯的时候&#xff0c;特别是串口连接使用的usb接口作为物理介质的时候&#xff0c;报错 NO_READ_WRITE_PERMISSION &#xff0c;一个很容易忽略的问题就是串口地址错误 因为每个机器都有自己的串口地址名称定义方式。 解决办法&#xff1a;1、通过cmd sh…

Google Chrome RCE漏洞 CVE-2020-6507 和 CVE-2024-0517的简单分析

本文深入研究了两个在 Google Chrome 的 V8 JavaScript 引擎中发现的漏洞&#xff0c;分别是 CVE-2020-6507 和 CVE-2024-0517。这两个漏洞都涉及 V8 引擎的堆损坏问题&#xff0c;允许远程代码执行。通过EXP HTML部分的内存操作、垃圾回收等流程方式实施利用攻击。 CVE-2020-…

查询机器近期的重启记录

打开Command Prompt命令行&#xff0c;运行下面命令&#xff1a; systeminfo | find "System Boot Time:" 如图&#xff0c;这台设备上一次重启时间是1月21日。

Ant Design Vue详解a-tree-select使用树形选择器,递归渲染数据,点击选项回显,一二级菜单是否可选等问题

后台给的树形数据&#xff1a; {"code": 200,"data": [{"code": "jsd","children": [{"code": "hx","children": [],"name": "航向","id": 8,"libTable…

YOLOv8改进 | Conv篇 | 利用DualConv二次创新C2f提出一种轻量化结构(轻量化创新)

一、本文介绍 本文给大家带来的改进机制是利用DualConv改进C2f提出一种轻量化的C2f,DualConv是一种创新的卷积网络结构,旨在构建轻量级的深度神经网络。它通过结合33和11的卷积核处理相同的输入特征映射通道,优化了信息处理和特征提取。DualConv利用组卷积技术高效排列卷积…

【AI】Chinese-LLaMA-Alpaca-2 7B llama.cpp 量化方法选择及推理速度测试 x86_64 RTX 2060 6G 显存太小了

环境 操作系统 CPU 内存 生成量化版本模型 转换出q4_0 q4_k q6_k q8_0模型 cd ~/Downloads/ai/llama.cpp sourvce venv/bin/activate ~/Downloads/ai/llama.cpp/quantize /home/yeqiang/Downloads/ai/chinese-alpaca-2-7b/ggml-model-f16.gguf /home/yeqiang/Downloads/ai/ch…

mapstruct自定义转换,怎样将String转化为List

源码&#xff1a;https://gitee.com/cao_wen_bin/test 最近在公司遇到了这样一个为题&#xff0c;前端传过来的是一个List<Manager>,往数据库中保存到时候是String&#xff0c;这个String使用谷歌的json转化器。 当查询的时候在将这个数据库中String的数据以List<Mana…

Leetcode—29. 两数相除【中等】

2023每日刷题&#xff08;九十四&#xff09; Leetcode—29. 两数相除 叛逆期实现代码 class Solution { public:int divide(int dividend, int divisor) {if(dividend INT_MIN && divisor -1) {return INT_MAX;} return dividend / divisor;} };运行结果 倍增算法…

牛客NC222104重排字符串(C++)

题目链接 实现方法 统计各字符出现的次数&#xff1b;判断是否能实现重排&#xff08;根据出现次数最多的字符数量ma和字符总长度n判断&#xff09;&#xff1b;依次输出出现次数最多的两个字符&#xff0c;直到出现次数最多的字符和次多的字符数量相同&#xff1b;依次输出…

代码随想录算法训练营第30天 | 回溯总结 + 3道Hard题目

今日任务 332.重新安排行程 51. N皇后 37. 解数独 总结 总结 回溯总结&#xff1a;代码随想录 回溯是递归的副产品&#xff0c;只要有递归就会有回溯&#xff0c;所以回溯法也经常和二叉树遍历&#xff0c;深度优先搜索混在一起&#xff0c;因为这两种方式都是用了递归。 …

redis排序

文章目录 简介SORT命令的实现ALPHA选项的实现ASC和DESCBYLIMITGET命令 类似映射STORE选项的实现多个命令的执行顺序 简介 Redis的SORT命令可以对列表键、集合键或者有序集合键的值进行排序。 SORT命令的实现 服务器执行SORT numbers 命令的详细步骤如下&#xff1a; 1&#…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

DevSecOps 参考模型介绍

目录 一、参考模型概述 1.1 概述 二、参考模型分类 2.1 DevOps 组织型模型 2.1.1 DevOps 关键特性 2.1.1.1 模型特性图 2.1.1.2 特性讲解 2.1.1.2.1 自动化 2.1.1.2.2 多边协作 2.1.1.2.3 持续集成 2.1.1.2.4 配置管理 2.1.2 DevOps 生命周期 2.1.2.1 研发过程划分…

SqlAlchemy使用教程(六) -- ORM 表间关系的定义与CRUD操作

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解SqlAlchemy使用教程(四) MetaData 与 SQL Express Language 的使用SqlAlchemy使用教程(五) ORM API 编程入门 本章内容&#xff0c;稍微有…

七种较为成熟的渗透测试标准方法

文章目录 前言一、OWASP渗透测试二、渗透测试执行标准(PTES)三、NIST特别出版物800-115四、ISSAF渗透测试框架五、CREST渗透测试方法六、MITRE(ATT&CK)七、OSSTMM开源安全测试方法总结前言 对于网络安全领域的攻击端, 进行渗透测试的方式几乎是无限多的。由于在进行渗…

AI:120-智能监控下的行人交通违法行为自动罚款系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

LFU算法

LFU算法 Least Frequently Used&#xff08;最不频繁使用&#xff09; Leetcode有原题&#xff0c;之前手写过LRU&#xff0c;数据结构还是习惯于用java实现&#xff0c;实现是copy的评论题解。 题解注释写的很清楚 大致就是说LFUCache类维护一个存放node的map&#xff0c;同…