代码随想录:贪心2-4

455.分发饼干

题目

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例 1:

输入: g = [1,2,3], s = [1,1]
输出: 1
解释: 
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。

示例 2:

输入: g = [1,2], s = [1,2,3]
输出: 2
解释: 
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

代码(控制饼干,从小到大分)

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g); //胃口
        Arrays.sort(s); //饼干

        int index = 0;  //胃口
        int count = 0;  //满足的小孩数量

        //用for循环控制饼干1357的原因是:从小到大,给每一个饼干找小孩
        //如果这个饼干可以满足小孩就给出去,如果满足不了,饼干太小了就轮空不给
        //不管饼干有没有被分出去,都需要判断下一个饼干了
        
        //从小到大分饼干,for循环控制饼干,1357
        for(int i=0; i < s.length; i++){
            //这个饼干可以满足胃口
            if(index  < g.length && g[index] <= s[i]){ //while控制胃口246
                count++;
                index++; //胃口满足,往后给下一个小孩
            }
            //如果饼干太小满足不了,比如饼干1不要了,i++,从下一个饼干开始给
        }
        return count;
    }
}

代码(控制胃口,从大到小分)

class Solution {
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g); //胃口
        Arrays.sort(s); //饼干

        int index = s.length - 1;  //饼干
        int count = 0;  //满足的小孩数量

        //用for控制胃口1357的原因是,从大到小,对每一个小孩找饼干
        //如果有足够大饼干就给他,没有的话这个小孩就被轮空不吃
        //小孩的胃口不过有没有满足,都需要找下一个小孩子了

        //for循环控制胃口,从大到小满足小孩胃口
        for(int i = g.length-1; i >= 0; i--){ //胃口1357
            //有满足当前最大胃口的饼干
            if(index >= 0 && g[i] <= s[index]){    //控制饼干246,从后往前给饼干
                count++;
                index--;  //饼干分出去了,往前指向前一个饼干
            }
            //胃口太大,没有满足的饼干,别吃了,比如胃口7,i--直接找下一个小孩
        }
        return count;
    }
}

总结

        两种逻辑,一种是控制胃口,从大到小分,一种是控制饼干,从小到大分。

        1、控制胃口,从大到小分

        用for控制胃口1357的原因是,从大到小,对每一个小孩找饼干246。如果有足够大饼干就

他,没有的话这个小孩就被轮空不吃。小孩的胃口不管有没有满足,都需要找下一个小孩子了。

        比如第一个小孩胃口7,饼干6满足不了,他就被轮空吃不到,for循环i--,找下一个胃口小

孩。但是饼干没有分出去还是指向6。

        2、控制饼干,从小到大分

        用for控制饼干1357的原因是,从小到大,对每一个饼干找小孩246。如果这个饼干可以满足

当前小孩就分出去,满足不了的话这个饼干就被轮空分不出去。饼干不管有没有分出去,都需要找

下一个饼干了。

        比如第一个饼干1,小孩胃口2满足不了,饼干就被轮空分不出去,for循环i++,找下一个饼

干。但是小孩没有拿到饼干指向2。

总结:for循环控制的逻辑就是,被轮空的不用管的在for循环里。

从大到小从胃口找饼干,大胃口可能被轮空,需要用for循环控制,胃口太大就算了不吃了。

从小到大从饼干找胃口,小饼干可能被轮空,需要用for循环控制,饼干太小就算了不分了。

        

      

376.摆动序列

题目

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

  • 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

  • 相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。

示例 1:

输入:nums = [1,7,4,9,2,5]
输出:6
解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3) 。

示例 2:

输入:nums = [1,17,5,10,13,15,10,5,16,8]
输出:7
解释:这个序列包含几个长度为 7 摆动序列。
其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8) 。

代码

class Solution {
    public int wiggleMaxLength(int[] nums) {
        //nums长度为1直接返回
        if(nums.length == 1){
            return 1;
        }
        int count = 1; //i=0是长度直接算上
        int pre = 0;
        int cur = 0;
        for(int i=1; i < nums.length; i++){
            cur = nums[i] - nums[i-1];
            //这里要特别注意,不能写成pre*cur<0或pre*cur<=0
            //如果写成pre*cur<0,i=1,pre为0,前两个数就判断失败了
            //如果写成pre*cur<=0,可能序列是133333,是cur=0,不能算是满足条件的序列
            //所以不仅仅要求pre和cur异号,还要考虑前两个数判断时pre=0的情况,但cur不能为0
            if(pre <= 0 && cur > 0 || pre >= 0 && cur < 0){
                count++;
                pre = cur;  //更新pre为当前的差值
            }
            //如果当前i的cur不满足条件,这个nums[i]就自动不算在序列中了
        }
        return count;
    }
}

总结

        用pre和cur分别表示前面的差值和当前的差值。如果pre和cur满足条件,就让count++,表示

序列长度加1,但是如果不满足条件,就跳过当前序列位置,继续往后面判断。比如1543218。154

满足count=3,但是321的cur和54的pre同号都小于0,所有321都不能算,count不会计数,最后8

满足,54的pre<0,48的cur大于0,满足条件,最后count=4。

        我们希望pre和cur是异号的,简单考虑是pre*cur<0,但这样写会出错。因为序列132,初始

count=1,从3开始遍历,pre=0,cur=3-1=2,这最开始的两个数字,pre=0,需要单独考虑。也不

能简单写成pre*cur<=0,因为我们不运行cur=0,即序列1322222,后面重复的2都不能算。

        所以判断序列满足条件应该写成pre <= 0 && cur > 0 || pre >= 0 && cur < 0,然后count++,

再令pre=cur,序列继续往后判断。

53.最大子数组和

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组

是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

代码

class Solution {
    public int maxSubArray(int[] nums) {

        int res = Integer.MIN_VALUE;  //初始化res为最小整数
        int count = 0;
        for(int i=0; i < nums.length;i++){
            count += nums[i];  //count是序列累加和
            //如果累加和大于res,更新res
            if(count > res){
                res = count;
            }
            //如果count小于0,说明前面的序列起副作用,不要了
            if(count < 0){
                count = 0;
            }
        }
        return res;
    }
}

总结

        核心就是用count计算子序列的和,一旦发现count小于0,说明前面的序列起到副作用,为了最大序列和,前面的序列肯定没有用了,直接把count归零,从后面重新开始找。如果count大于res,就把res更新一下,保证res一定是局部最大。

        注意,对res的更新必须要写在count小于0归零的前面,因为如果序列是[-2,-1],也要保证res中先把-2和-1存下来,不能直接用count=0,把负数序列覆盖了,因为count代表的最大序列和也可能是负数,当整个序列全是负数的时候。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哲讯SAP知识分享:SAP资产模块常用事务代码清单

在当今日益复杂的商业环境中&#xff0c;企业对于资产管理的需求日益增强。SAP作为全球领先的企业管理软件提供商&#xff0c;其资产模块&#xff08;AM&#xff09;以其高效、灵活的特性&#xff0c;为企业提供了全面的资产管理解决方案。本文将对SAP资产事务类型进行详细介绍…

阿贝云免费虚拟主机和免费云服务器评测

阿贝云是一家提供免费虚拟主机和免费云服务器的服务提供商&#xff0c;为用户提供高性能的云计算服务。阿贝云的免费虚拟主机拥有稳定的性能和强大的安全性&#xff0c;用户可以轻松搭建自己的网站并享受无限的流量和空间。免费云服务器则提供了更强大的计算能力和灵活的配置选…

Samtec汽车电子 | 汽车连接器如何在高要求、极端的环境中工作

【摘要/前言】 汽车电子&#xff0c;这些年来始终是极具流量的热门话题&#xff0c;目前不断发展的智能座驾、辅助驾驶等赛道都是对相关产业链需求的进一步刺激&#xff0c;这里蕴含着一片广阔的市场。 同样&#xff0c;广阔的市场里有着极高的准入门槛和事关安全的技术挑战。…

买的Google账号登录,修改辅助邮箱收不到验证码?可能是个简单的错误

这篇文章分享一个案例&#xff0c;购买了谷歌账号以后如何修改辅助邮箱&#xff0c;修改辅助邮箱的一些要点&#xff0c;以及常见的一个错误。 一、案例回放 这个朋友昨天在我的一个视频下面留言说买了谷歌账号以后&#xff0c;想修改辅助邮箱地址&#xff0c;但是输入了辅助…

基于模型预测控制的PMSM系统速度环控制理论推导及仿真搭建

模型预测控制&#xff08;Model Predictive Control, MPC&#xff09;是一种先进的控制策略&#xff0c;广泛应用于工业控制中。它可以看作是一种最优控制方法&#xff0c;利用对象的动态模型来预测其状态的未来行为&#xff0c;并根据每个采样时间点特定性能目标函数的优化来确…

单片机软件架构连载(3)-typedef

今天给大家讲typedef&#xff0c;这个关键字在实际产品开发中&#xff0c;也是海量应用。 技术涉及知识点比较多&#xff0c;有些并不常用&#xff0c;我们以贴近实际为原则&#xff0c;让大家把学习时间都花在重点上。 1.typedef的概念 typedef 是 C 语言中的一个关键字&…

java wait, notify, notifyAll三个方法

wait(), notify(), 和 notifyAll() 是 Java 中用于线程间通信和同步的方法&#xff0c;它们都是 Object 类中的方法&#xff0c;而非 Thread 类的方法。这些方法通常与 synchronized 关键字一起使用&#xff0c;用于实现线程之间的协作和互斥访问共享资源。 关于生产者-消…

Apache Seata配置管理原理解析

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata配置管理原理解析 说到Seata中的配置管理&#xff0c;大家可能会想到Seata中适配…

传统IO和NIO文件拷贝过程

参考&#xff1a;https://blog.csdn.net/weixin_57323780/article/details/130250582

几个小创新模型,KAN组合网络(LSTM、GRU、Transformer)回归预测,python预测全家桶再更新!...

截止到本期&#xff0c;一共发了9篇关于机器学习预测全家桶Python代码的文章。参考往期文章如下&#xff1a; 1.终于来了&#xff01;python机器学习预测全家桶 2.机器学习预测全家桶-Python&#xff0c;一次性搞定多/单特征输入&#xff0c;多/单步预测&#xff01;最强模板&a…

【网络安全】实验三(基于Windows部署CA)

一、配置环境 打开两台虚拟机&#xff0c;并参照下图&#xff0c;搭建网络拓扑环境&#xff0c;要求两台虚拟的IP地址要按照图中的标识进行设置&#xff0c;并根据搭建完成情况&#xff0c;勾选对应选项。注&#xff1a;此处的学号本人学号的最后两位数字&#xff0c;1学号100…

《python程序语言设计》2018版第5章第52题利用turtle绘制sin函数

这道题是送分题。因为循环方式已经写到很清楚&#xff0c;大家照抄就可以了。 但是如果说光照抄可是会有问题。比如我们来演示一下。 import turtleturtle.penup() turtle.goto(-175, 50 * math.sin((-175 / 100 * 2 * math.pi))) turtle.pendown() for x in range(-175, 176…

k8s学习之cobra命令库学习

1.前言 打开k8s代码的时候&#xff0c;我发现基本上那几个核心服务都是使用cobra库作为命令行处理的能力。因此&#xff0c;为了对代码之后的代码学习的有比较深入的理解&#xff0c;因此先基于这个库写个demo&#xff0c;加深对这个库的一些理解吧 2.cobra库的基本简介 Git…

算法设计与分析 实验5 并查集法求图论桥问题

目录 一、实验目的 二、问题描述 三、实验要求 四、实验内容 &#xff08;一&#xff09;基准算法 &#xff08;二&#xff09;高效算法 五、实验结论 一、实验目的 1. 掌握图的连通性。 2. 掌握并查集的基本原理和应用。 二、问题描述 在图论中&#xff0c;一条边被称…

IDEA发疯导致maven下载回来的jar不完整zip END header not found

IDEA发疯导致maven下载回来的jar不完整zip END header not found 具体报错 java: 读取D:\mavenRepository\com\alibaba\druid-spring-boot-starter\1.2.23\druid-spring-boot-starter-1.2.23.jar时出错; zip END header not foundjava: java.lang.RuntimeException: java.io.…

Python视觉轨迹几何惯性单元超维计算结构算法

&#x1f3af;要点 &#x1f3af;视觉轨迹几何惯性单元超维计算结构算法 | &#x1f3af;超维计算结构视觉场景理解 | &#x1f3af;超维计算结构算法解瑞文矩阵 | &#x1f3af;超维矢量计算递归神经算法 &#x1f36a;语言内容分比 &#x1f347;Python蒙特卡罗惯性导航 蒙…

【感谢告知】本账号内容调整,聚焦于Google账号和产品的使用经验和问题案例分析

亲爱的各位朋友&#xff1a; 感谢您对本账号的关注和支持&#xff01; 基于对朋友们需求的分析和个人兴趣的转变&#xff0c;该账号从今天将对内容做一些调整&#xff0c;有原来的内容改为Google&#xff08;谷歌&#xff09;账号和产品的使用经验&#xff0c;以及相关问题的…

LeetCode 744, 49, 207

目录 744. 寻找比目标字母大的最小字母题目链接标签思路代码 49. 字母异位词分组题目链接标签思路代码 207. 课程表题目链接标签思路代码 744. 寻找比目标字母大的最小字母 题目链接 744. 寻找比目标字母大的最小字母 标签 数组 二分查找 思路 本题比 基础二分查找 难的一…

《python程序语言设计》2018版第5章第53题利用turtle绘制sin和cos函数 sin蓝色,cos红色和52题类似

直接上题和代码 5.53 &#xff08;Turtle&#xff1a;绘制sin和cos函数&#xff09;编写程序绘制蓝色的sin函数和红色的cos函数。 代码和结果 turtle.speed(10) turtle.penup() # sin 用蓝色 turtle.color("blue") #这道题和上道题一样&#xff0c;先把turtle放到起始…

pandas读取CSV格式文件生成数据发生器iteration

背景 数据集标签为csv文件格式&#xff0c;有三个字段column_hander [‘id’, ‘boneage’, ‘male’]&#xff0c;需要自己定义数据集。文件较大&#xff0c;做一个数据发生器迭代更新数据集。 实现模板 在Pandas中&#xff0c;可以使用pandas.read_csv函数读取CSV文件&…