代码随想录 Day26 贪心 01 全集 LeetCode455 分发饼干 LeetCodeT346摆动序列 LeetCdoe T53 最大子数组和

news2024/11/19 4:41:13

 前言:贪心无套路

本质:

局部最优去推导全局最优

两个极端

贪心算法的难度一般要么特别简单,要么特别困难,所以我们只能多见识多做题,记住无需数学证明,因为两道贪心基本上毫无关系,我们只需要去思考局部最优即可

 贪心的小例子

比如有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?

那肯定是每次拿最大的就行,局部最优就是每次拿最大数额的钞票,全局最优就是最后数额的总和是最大的.

贪心无套路!!!

这里贪心没有任何的模板总结,因为解决不同问题的贪心策略是完全不同的,我们不需要严格的数学证明,如果面对一道题你有这么一种贪心的策略,同时你找不到任何明显的反例,那么就可以照着这个思路来思考问题... 

LeetCode T455 分发饼干

题目链接:455. 分发饼干 - 力扣(LeetCode)

题目思路:

这题我们有两种思路可以解决问题

1.优先考虑胃口:大饼干喂饱大胃口

这里的局部最优就是充分利用大饼干来喂饱小孩,全局最优就是喂饱尽可能多的小孩

(尽可能让吃饱的人多)

2.优先考虑饼干:小饼干先喂饱小胃口

这里的局部最优是花费掉最小的饼干,让小饼干物尽其用,全局最优是使饼干的花费更有性价比.

(尽可能让饼干发挥最大的效果)

题目代码

//解法一:
class Solution {
    int count = 0;
    int start = 0;
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);

        for(int i = 0;i<s.length && start<g.length;i++)
        {
            if(s[i]>=g[start])
            {
                start++;
                count++;
            }
        }
        return count;

    }
}

//解法2
class Solution {
    int count = 0;
    int start ;
    public int findContentChildren(int[] g, int[] s) {
        start = s.length-1;
        Arrays.sort(g);
        Arrays.sort(s);

        for(int i = g.length-1;i>=0;i--)
        {
            if(start >= 0 && s[start]>=g[i])
            {
                start--;
                count++;
            }
        }
        return count;

    }
}

 LeetCode T376 摆动序列

题目链接:376. 摆动序列 - 力扣(LeetCode)

前言 

 这题我们看到可以删除数组中的元素也可以不删除可能就吓到了,其实是这道题可以用动态规划或者贪心的策略去解决问题,这里我们还是用贪心的解法去解决问题,具体动态规划的思路可以参照网站:代码随想录 (programmercarl.com)

摆动数列的定义 

做这题之前我们得明白什么是摆动序列,举个例子[2,6,1,9,3]这个数组,呈现一个波动变化的形态,就称为摆动序列

如果序列只有两个元素,这里就认为摆动序列的长度为2,默认有两个摆动

题目思路:

这题我们首先要考虑情况,我列出以下三种情况:

1.首末元素

2.上下有平坡

3.单调有平坡

变量定义

curDiff:记录当前差值        假设目前遍历到的元素为i  ,curDiff = nums[i+1] - nums[i]

preDiff:记录之前的差值                              preDiff = nums[i] - nums[i-1]

count 记录结果,为了满足默认首尾元素的情况,我们默认count从1开始取值

我们只需要遍历一次数组,满足前后diff不同号即可

注意不能写成curDiff>=0这种情况,因为这样就表示从高或者低值到平坡,是不增加波动的

最后每次结束让pre更新为cur就可以了

这是一个错误的思路,我们是只有遇到了坡度变化才会让pre更新

for(int i = 0;i<nums.length-1;i++)
        {
            curDiff = nums[i+1] - nums[i];
            if((curDiff>0 && preDiff<=0 ) || (curDiff<0 && preDiff>=0))
            {
                count++;
                preDiff = curDiff;
            }
        }

代码模板:

class Solution {
    public int wiggleMaxLength(int[] nums) {
        if(nums.length<=1)
        {
            return nums.length;
        }
        int preDiff = 0;
        int count = 1;
        int curDiff = 0;
        for(int i = 0;i<nums.length-1;i++)
        {
            curDiff = nums[i+1] - nums[i];
            if((curDiff>0 && preDiff<=0 ) || (curDiff<0 && preDiff>=0))
            {
                count++;
                preDiff = curDiff;
            }
        }
        return count;

    }
}

 LeetCode T53 最大子数组和

题目链接:53. 最大子数组和 - 力扣(LeetCode)

 

题目思路:

贪心贪的是哪里呢?

如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!

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

全局最优:选取最大“连续和”

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。

这相当于是暴力解法中的不断调整最大子序和区间的起始位置

定义变量:

count:记录局部和

sum:记录目前出现的最大和

思路:一层for循环遍历数组,每次遇到连续子数组之和为负数的时候,就从下一个元素继续开始叠加,每次叠加一个元素对sum进行一次更新.

题目代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int count = 0;//目前值
        int sum = Integer.MIN_VALUE;//目前出现的最大值
        for(int i = 0;i<nums.length;i++)
        {
            count+=nums[i];
            sum = Math.max(count,sum);
            if(count < 0)
            {
                count = 0;
            }
        }
        return sum;

    }
}

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

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

相关文章

vue 生命周期钩子函数 mounted()实例

在挂载后操作dom获取焦点。 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"w…

Maven3.9.2 bug IDEA指定配置文件不生效

Maven3.9.2 bug IDEA指定配置文件不生效 描述 运行新项目需要配置指定的settings.xml文件&#xff0c;一直报错找不到依赖&#xff0c;查看maven日志是从maven中心仓库找的依赖&#xff0c;自然找不到。 解决过程 清理idea缓存&#xff0c;仍然报错 删除/${username}/.m2/…

三分钟实现MQTT协议网关网口连接西门子SMART200PLC上传阿里云服务器

MQTT协议网关网口连接西门子SMART200PLC操作说明v1.4 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工作 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器准备工作 三. 阿里云IoT平台配置步骤 3.1 创建产品 3.2 添加设备 …

取证之查看本机保存的WiFi密码

一、电脑保存有WiFi密码&#xff0c;且正常连接该WiFi 1、打开网络适配器高级选项 2、双击无线网卡&#xff0c;选择无线属性 3、点击安全&#xff0c;显示字符&#xff0c;即可看到WiFi密码。 二、电脑保存有密码&#xff0c;但是没有链接WiFi。 1、查看wlan接口上的配置文件…

蓝桥杯每日一题0223.10.23

第几天 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 简单枚举&#xff08;用k来记录经过的天数&#xff09; #include<bits/stdc.h> using namespace std; bool is_ren(int n) {if(n % 400 0 || (n % 4 0 && n % 100 ! 0))return true;return false; } int …

推荐微软的开源课程《AI-For-Beginners》

今天给大家推荐一个对新手非常友好的AI入门课程《AI-For-Beginners》。 该课程由微软推出&#xff0c;为期12周&#xff0c;共24课时&#xff0c;对比Google的AI入门课更通俗易懂一些&#xff0c;强烈推荐刚入门的AI小白们学习&#xff01;而且是免费&#xff01;课程资源看文…

Matlab论文插图绘制模板第122期—函数折线图(fplot)

本期分享的是函数折线图的绘制模板。​ 所谓函数折线图&#xff0c;就是将自定义线函数进行可视化表达​。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋友可以关注同名公号【阿昆的…

基于springboot基于会员制医疗预约服务管理系统项目【项目源码+论文说明】

基于springboot实现会员制医疗预约服务信息系统演示 摘要 会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中&#xff0c;会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需…

Java Spring 通过 AOP 实现方法参数的重新赋值、修改方法参数的取值

AOP 依赖 我创建的项目项目为 SpringBoot 项目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.3</version></parent><dependency><groupId…

Linux:【Kafka-Java一】Spring实现kafka消息的简单发送

目录 一、创建maven项目 二、引入依赖 三、创建生产者 一、创建maven项目 1.1、创建maven项目不再多说 二、引入依赖 1.1、maven项目创建完成后&#xff0c;需要引入以下依赖 // kafka 依赖<dependency><groupId>org.apache.kafka</groupId><artifact…

GRE MGRE原理与配置

IPSec VPN用于在两个端点之间提供安全的IP通信&#xff0c;但只能加密并传播单播数据无法加密和传输语音、视频、动态路由协议信息等组播数据流量。通用路由封装协议GRE( Generic Routing Encapsulation )提供了将一种协议的报文封装在另一种协议报文中的机制&#xff0c;是一种…

华为云全新上线Serverless应用中心,支持一键构建文生图应用

近日&#xff0c;华为云全新上线Serverless应用中心&#xff0c;提供了大量应用模板&#xff0c;让用户能够一键部署函数和周边依赖资源&#xff0c;节省部署时间&#xff0c;快速上手将应用部署到华为云函数计算FunctionGraph&#xff0c;并一键开通周边依赖资源。 本次Serve…

微信小程序ios页面没有滚动下拉也会出现黑色背景

问题截图&#xff1a; 查了一下资料说有用一下方法解决的&#xff1a; 整体overflow: hidden&#xff0c;页面的内容将无法滚动&#xff08;试了一下没用&#xff09;&#xff1b;设置 -webkit-overflow-scrolling 和 touch-action 样式属性来禁用页面的拖动和拉拽操作&…

底层驱动day4作业

分布注册设备&#xff0c;实现文件和设备的绑定 代码&#xff1a; //head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_RCC 0x50000A28 #define PHY_GPIOE_MODER 0x50006000 #define PHY_GPIOF_MODER 0x50007000 #define PHY_GPIOE_ODR 0x50006014 #define PHY_GPI…

VR虚拟现实技术在法院技能培训中的应用

开展法治宣传教育&#xff0c;是全面贯彻落实科学发展观的重要决策&#xff0c;也是保障和促进经济设备会发展和实施“十一五”规划的内在要求。为了让全民法治文化宣传深入人们群众中&#xff0c;突破性地采用VR虚拟现实、web3d开发和三维仿真技术&#xff0c;开发线上法治文化…

Git的标签管理

Git标签管理 创建标签操作标签小结 创建标签 在Git中打标签非常简单&#xff0c;首先&#xff0c;切换到需要打标签的分支上&#xff1a; $ git branch $ git checkout master 然后&#xff0c;敲命令git tag 就可以打一个新标签&#xff1a; $ git tag v1.0 可以用命令git …

大一新生必备电脑软件插件有哪些?

毕业老学姐倾情分享珍藏必备软件和浏览器插件&#xff01;拥有后生活明朗&#xff0c;学习效率UPUP&#xff01; 纯干货分享建议【点赞收藏】后观看 速览 Office全家桶-Word、Excel、Powerpoint大学生必备 火绒安全-计算机防病毒软件 AI助手-AI对话写作阅读助手&#xff0c;…

HCIP-MGRE实验

实验拓扑图 需求 1 R5为ISP &#xff0c;只能进行IP地址配置;其所有地址均配为公有IP地址 2 R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2于R5之间使用ppp的chap认证&#xff0c;R5为主认证方; R3于R5之间使用HDLC封装。 3 R1/R2/R3构建一个MGRE环境&#xff0c;R1为…

创新驱动|RFID技术在智能半导体行业的应用

半导体产业是我国重要的战略性新兴产业&#xff0c;是一个需要高度协同的领域&#xff0c;需要各个环节的紧密配合。RFID技术&#xff0c;作为一种自动识别和数据采集技术&#xff0c;在半导体生产线上具有独特的优势。通过应用RFID技术&#xff0c;半导体制造企业可以实现生产…

基于Python+Selenium+Unittest+PO设计模式

一、什么是PO设计模式&#xff08;Page Object Model&#xff09; 1、Page Object是一种设计模式&#xff0c;它主要体现在对界面交互细节的封装上&#xff0c;使测试用例更专注于业务的操作&#xff0c;从而提高测试用例的可维护性。 2、一般PO设计模式有三层 第一层&#x…