代码随想录:贪心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循环控制饼干,1357for(int i=0; i < s.length; i++){//这个饼干可以满足胃口if(index  < g.length && g[index] <= s[i]){ //while控制胃口246count++;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不能为0if(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,更新resif(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.mzph.cn/diannao/43036.shtml

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

相关文章

考CISP,不要踩坑的几点建议

当你立志要在信息安全领域闯出一片天&#xff0c;可能多少都会听行内人说&#xff0c;搞本CISP。但这个认证究竟该怎么拿&#xff1f;需要培训吗&#xff1f;培训又是怎么一回事&#xff1f;价格如何&#xff1f;还有&#xff0c;什么时候开始准备最好&#xff1f;这些问题可能…

C++ Lambda表达式第一篇, 闭合(Closuretype)

C Lambda表达式第一篇&#xff0c; 闭合Closuretype ClosureType::operator()(params)auto 模板参数类型显式模板参数类型其他 ClosureType::operator ret(*)(params)() lambda 表达式是唯一的未命名&#xff0c;非联合&#xff0c;非聚合类类型&#xff08;称为闭包类型&#…

【实习问题记录】Nodeclub本地部署

问题描述 在按照官方网站给出的教程一步一步操作以后发现出现以下报错&#xff1a; 问题分析 显示连接不上mongodb&#xff0c;分析报错可能是因为版本不匹配导致的&#xff0c;查看安装的mongodb版本发现是7.0.4&#xff0c;与目标版本不匹配&#xff0c;同时查看mongodb官…

我们所熟知的meme梗图也可以用AI生成了,老外都玩坏了。

meme梗图不知道大家看到过嘛&#xff1f;相信你们看见下面的图你就会大叫“卧槽”&#xff0c;原来是这种图&#xff0c;我以前经常狂刷不止&#xff0c;太有趣了。 其实meme是一个网络流行语&#xff0c;可译为模因。在大众非学术范围内也可翻译为我们所熟知的“梗”。其中“表…

SDK环境的安装(测试使用)

1、安装 将文件解压至目录,我的目录为:D:\Program Files\Android 解压后如下: 下载链接如下: sdk下载 提取码见文章最后: 2、配置环境 1、在环境变量中,选择系统变量,点击新建。 变量名:ANDROID_HOME 变量值:“你自己的android-sdk安装路径” (例如我的:D:\Pro…

CF1955C Inhabitant of the Deep Sea 题解

题目 模拟 首先想到模拟。 但是看到数据范围&#xff0c;模拟不了。 #include<bits/stdc.h> #include<cstring> #include<queue> #include<set> #include<stack> #include<vector> #include<map> #define int long long #define …

如何在 Linux 中高亮显示日志关键字

在 Linux 系统中&#xff0c;实时查看日志文件通常使用 tailf 命令&#xff0c;但 tailf 本身并不支持高亮显示关键字功能。通过结合 grep、sed 等工具&#xff0c;我们可以实现日志关键字高亮。本文将介绍几种高效的方法来实现这一目标。 方法一&#xff1a;使用 grep --color…

人机交互中有许多不满足紧致性条件的地方

紧致性条件通常用于描述拓扑空间的性质。一个拓扑空间被称为紧致的&#xff0c;如果它的任意开覆盖都有有限子覆盖。换句话说&#xff0c;对于任何开覆盖&#xff0c;都可以从中选取有限个开集&#xff0c;它们的并仍然覆盖整个空间。 满足紧致性条件的方法通常包括以下几种&am…

7月8日 四道经典单链表oj题

大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不足之…

CSS--表格自适应宽度并设置最小宽度

原文网址&#xff1a;CSS--表格自适应宽度并设置最小宽度_IT利刃出鞘的博客、-CSDN博客 简介 本文介绍怎样让HTML的表格自适应宽度。 Java技术星球&#xff1a;way2j.com 问题描述 默认样式下&#xff0c;表格会出现某一列很窄的情况&#xff1a; 代码&#xff1a; <h…

Redission 解锁异常:attempt to unlock lock, not locked by current thread by node id

标题&#xff1a;解锁异常&#xff1a;Redission中的"attempt to unlock lock, not locked by current thread by node id"问题分析与解决方案 在分布式系统中&#xff0c;锁是常用的同步机制&#xff0c;用于保护共享资源&#xff0c;避免并发冲突。Redission是一个…

java-多线程 2

### 7. 线程池 线程池是管理和复用线程的机制&#xff0c;可以避免频繁创建和销毁线程的开销。Java 提供了 Executor 框架来管理线程池。 #### 7.1 使用 Executors 工厂类 Executors 工厂类提供了一些静态方法&#xff0c;用于创建常见类型的线程池。 java import java.uti…

[240708] 中国 AI 企业在世界人工智能大会上展现韧性与创新

目录 中国 AI 企业在世界人工智能大会上展现韧性与创新 中国 AI 企业在世界人工智能大会上展现韧性与创新 中国科技公司在本周上海举行的世界人工智能大会上展现出强大的韧性和创新能力。超过150 种 AI 相关产品和解决方案在大会上展出&#xff0c;包括商汤科技、华为、科大讯…

电机工厂MES系统-提升生产效率与质量的关键

本文将详细介绍万界星空科技电机行业MES系统的特随着电机行业的快速发展&#xff0c;生产管理的复杂性和精细度日益提高。为了应对这一挑战&#xff0c;万界星空科技MES&#xff08;制造执行系统&#xff09;解决方案&#xff0c;为电机行业带来了前所未有的生产管理变革。点、…

Elasticsearch 分析器(Analyzer)的作用和配置

在Elasticsearch中&#xff0c;分析器&#xff08;Analyzer&#xff09;是文本处理的核心组件&#xff0c;它负责将输入的文本转换为可用于搜索和索引的词项&#xff08;tokens&#xff09;。这一过程涉及多个步骤&#xff0c;包括字符过滤、分词和标记过滤&#xff0c;共同决定…

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例&#xff1a; function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在&#xff0c;直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组&#xff0c;遍历数组每个元素if (Array.isArray(obj)) {obj…

laravel设计模式详解

目录 创造模式 一. 工厂方法模式 1. Eloquent ORM 模型工厂 2. 表单请求工厂 3. 服务容器中的工厂方法 二. 抽象工厂模式 1. 配置文件 2. 服务提供者 3. 门面&#xff08;Facades&#xff09; 4. 多环境配置 5. 依赖注入容器 三.原型模式 1. 配置对象的复制 2. 请…

MyBatis的底层机制

手写MyBatis底层机制 读取配置文件&#xff0c;得到数据库连接 思路 引入必要的依赖需要写一个自己的config.xml文件&#xff0c;在里面配置一些信息&#xff0c;driver&#xff0c;url &#xff0c;password&#xff0c;username需要编写Configuration类&#xff0c;对 自己…

aosp 单独grep某种类型文件,加快grep速度。

1、问题 source build/envsetup.sh lunch xxx 后可以 mgrep 可以单独搜索makefile文件 cgrep 可以单独搜索c/c文件 jgrep 可以单独搜索java文件 具体可以查看build/envsetup.sh cat build/envsetup.sh function jgrep() {find . -name .repo -prune -o -name .git -prune -o …