day 27 第八章 贪心算法 part01

devtools/2024/11/30 17:23:37/

第一题:455.分发饼干

解题思路

本题的核心目标是在给定孩子的胃口值数组 g 和饼干尺寸数组 s 的情况下,尽可能多地满足孩子的胃口,也就是找到能满足孩子数量的最大值。解题思路主要是基于贪心算法,以下是具体的分析:

  1. 整体思路
    贪心算法的核心在于在每一步选择中,都做出当前状态下的最优选择,希望通过局部最优解最终达到全局最优解。对于这道题,我们的贪心策略是优先尝试用较大尺寸的饼干去满足胃口较大的孩子,这样能最大程度地利用饼干,满足更多的孩子。

  2. 数组排序预处理
    首先对孩子的胃口值数组 g 和饼干尺寸数组 s 分别进行排序(通过 Arrays.sort 方法)。排序的目的是为了方便后续按照从大到小的顺序去匹配饼干和孩子,使得贪心策略能够更有序地实施。经过排序后,胃口值较大的孩子在 g 数组的后面部分,尺寸较大的饼干在 s 数组的后面部分。

  3. 遍历匹配过程
    从胃口值最大的孩子开始遍历 g 数组(通过 for 循环,从 g.length - 1 开始,逐步往前遍历,索引 i 递减),对于每一个孩子,去寻找是否有合适的饼干可以满足他的胃口。这里合适的意思就是饼干的尺寸 s[j] 要大于等于孩子的胃口值 g[i]。同时,我们从尺寸最大的饼干开始找起,用一个变量 start 来标记当前可供选择的最大饼干的索引,初始化为 s.length - 1(也就是 s 数组的最后一个元素的索引)。

  4. 匹配与计数
    在循环中,每次检查当前孩子(索引为 i 的孩子)时,如果 start 大于等于 0(表示还有饼干可供选择)且当前最大尺寸的饼干(索引为 start 的饼干)尺寸 s[start] 大于等于这个孩子的胃口值 g[i],那就说明可以用这块饼干来满足这个孩子。此时,将 start 的值减 1(表示这块饼干已经被使用了,下一次要考虑尺寸稍小一点的饼干了),同时将满足的孩子数量计数器 count 加 1,表示又多满足了一个孩子。

  5. 最终结果返回
    当遍历完所有孩子或者已经没有合适的饼干可供选择时(也就是 for 循环结束),count 中记录的就是能够满足的孩子的最大数量,直接将其返回即可。

 代码

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count = 0;int start = s.length - 1;for(int i = g.length - 1;i >= 0;i--){if(start >= 0 && s[start] >= g[i]){start--;count++;}}return count;}
}

第二题:376. 摆动序列

解题思路

本题要求找出给定整数数组 nums 中作为摆动序列的最长子序列的长度,解题思路主要基于贪心算法,通过依次比较相邻元素的差值来确定摆动序列的长度,以下是详细说明:

  1. 整体思路
    贪心算法在这里的体现就是,我们希望尽可能多地保留那些能让序列呈现出摆动特性(差值正负交替)的元素,每遇到一次符合摆动特征的相邻元素对,就认为可以增加摆动序列的长度。

  2. 边界情况处理
    首先判断如果输入的 nums 数组长度为 1,根据定义仅有一个元素的序列也视作摆动序列,所以直接返回 1 即可。

  3. 初始化变量
    定义 prediff(前一个差值)和 curdiff(当前差值)两个变量,初始时 prediff 设为 0,因为在还没开始比较差值时可以看作差值不存在或者说初始差值为 0。同时定义 result 用于记录摆动序列的长度,初始值设为 1,这是考虑到即使数组中只有一个元素或者从第二个元素开始就不符合摆动条件了,最少也有 1 个元素构成摆动序列(符合摆动序列定义中仅有一个元素也算的情况)。

  4. 遍历数组比较差值
    通过 for 循环从数组的第一个元素开始,依次遍历到倒数第二个元素(索引为 i,循环条件是 i < nums.length - 1),在循环中计算当前相邻两个元素的差值 curdiff,即 curdiff = nums[i + 1] - nums[i]

  5. 判断摆动条件并更新长度与差值记录
    接着判断当前差值 curdiff 和前一个差值 prediff 是否满足摆动序列的条件,也就是判断 (prediff >= 0 && curdiff <= 0) || (prediff <= 0 && curdiff >= 0) 是否成立。如果成立,说明当前这对相邻元素构成了摆动特性(差值正负交替了),那么就将摆动序列的长度 result 加 1,表示找到了一个可以增加摆动序列长度的元素对。同时,把当前的 curdiff 赋值给 prediff,因为下一次比较时,这次的 curdiff 就变成前一个差值了,这样不断更新来持续判断后续元素是否还能继续构成摆动序列。

  6. 最终结果返回
    当循环遍历完整个数组(除了最后一个元素,因为是通过比较相邻元素的差值来判断,最后一个元素没办法再往后比较差值了)后,result 中记录的就是整个数组 nums 中作为摆动序列的最长子序列的长度,直接返回 result 即可。

代码

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

 第三题:53. 最大子序和

解题思路

本题要求找出给定整数数组 nums 中具有最大和的连续子数组,并返回其最大和,解题思路主要基于贪心算法,核心思想是在遍历数组的过程中,尽可能选择能让累加和变得更大的连续部分,以下是详细说明:

  1. 整体思路
    贪心算法在此处的体现是,我们在遍历数组时,每一步都基于当前的情况做出局部最优选择,即只要当前连续子数组的累加和是正数,就有可能对后续形成更大的和有帮助,那就继续累加;而一旦累加和变为负数了,那它对于后续求最大和就没有好处了,此时就舍弃之前的累加结果,重新开始计算新的连续子数组的和,通过这样不断地选择,最终找到整个数组中的最大子数组和。

  2. 边界情况处理
    首先判断如果输入的 nums 数组长度为 1,那么这个唯一的元素构成的子数组就是我们要找的子数组,直接返回这个元素(也就是 nums[0])即可。

  3. 初始化变量
    定义 sum 用于记录当前找到的最大子数组和,初始化为 Integer.MIN_VALUE,这样做是为了确保后续计算得到的任何和都能与它比较并更新,无论初始的数组元素情况如何。定义 count 用于记录当前连续子数组的累加和,初始值为 0。

  4. 遍历数组并更新累加和与最大和
    通过 for 循环从数组的第一个元素开始,依次遍历整个数组(索引为 i)。在循环中,先将当前元素 nums[i] 累加到 count 中(通过 count += nums[i]),表示当前连续子数组的和在不断更新。

  5. 比较并更新最大子数组和
    接着比较当前的累加和 count 与已记录的最大子数组和 sum 的大小,如果 count 大于 sum,那就说明找到了一个更大的子数组和,将 sum 更新为 count 的值(通过 if(count > sum) sum = count;),这样 sum 始终记录着到当前位置为止所发现的最大子数组和。

  6. 处理累加和为负的情况
    然后判断如果当前的累加和 count 小于 0,意味着从当前位置往前的这部分连续子数组对后续求最大和已经没有积极作用了(因为加上它只会让和变小),所以将 count 重置为 0(通过 if(count < 0) { count = 0; }),相当于舍弃这部分连续子数组,重新开始寻找新的可能构成更大和的连续子数组。

  7. 最终结果返回
    当循环遍历完整个数组后,sum 中记录的就是整个数组 nums 中具有最大和的连续子数组的和,直接返回 sum 即可。

代码

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

 

 


http://www.ppmy.cn/devtools/138257.html

相关文章

面试学习准备

根据面试题web前端面试 - 面试官系列 里面的题目学习巩固。 1.vue2 组件通信 EventBus&#xff1a; 讲解 全局事件总线&#xff0c;核心思想是通过发布-订阅模式来实现组件之间的通信 在 Vue 2 中&#xff0c;可以直接使用 Vue 实例作为 EventBus。 使用方法&#xff1a;在…

ubuntu24.04安装Kubernetes1.31.0(k8s1.30.0)高可用集群

ubuntu24.04安装Kubernetes1.30.0(kubernetes1.30.0)高可用集群 一、总体概览 目前最新版的K8S版本应该是1.31.0,我们安装的是第二新的版本1.30.0,因为有大神XiaoHH Superme指路,所以基本上没踩坑,很顺利就搭建完成了。所有的机器都采用的最新版Ubuntu-Server-24.04长期支…

Python plotly库介绍

一、引言 在数据可视化领域&#xff0c;Python提供了众多强大的库。其中&#xff0c;plotly是一个功能强大、交互式的可视化库&#xff0c;可以创建各种类型的图表&#xff0c;包括线图、散点图、柱状图、饼图、3D图表等。它不仅提供了美观的可视化效果&#xff0c;还支持交互式…

三、计算机视觉_08YOLO目标检测

0、前言 YOLO作为目前CV领域的扛把子&#xff0c;分类、检测等任务样样精通&#xff0c;本文将基于两个小案例&#xff0c;用YOLO做检测任务&#xff0c;看看效果如何 1、对图片内容做检测 假设我有一张名为picture.jpeg的图片&#xff0c;其内容如下 我将图片和代码放到了同…

mysql将一个表的数据插入到另一个表中

在MySQL中&#xff0c;可以使用INSERT INTO ... SELECT ...语句将一个表中的数据插入到另一个表。假设我们有两个表&#xff1a;source_table&#xff08;源表&#xff09;和target_table&#xff08;目标表&#xff09;&#xff0c;它们具有相同的结构。以下是一个示例代码&am…

360发布多模态创作引擎纳米搜索,近屿智能带你了解多模态大模型

11月27日晚&#xff0c;360集团正式发布了全新的多模态内容创作引擎——纳米搜索。这款引擎以“搜学写创”为核心能力&#xff0c;不仅打破了传统网页搜索的局限&#xff0c;还超越了现有的答案引擎&#xff0c;被行业解读为搜索引擎3.0&#xff0c;即“创作引擎”。 360集团创…

云计算之elastaicsearch logstach kibana面试题

1.ELK是什么? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 Elasticsearch:负责日志检索和储存 Logstash:负责日志的收集和分析、处理 Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,…

vue中如何获取public路径

在Vue项目中获取public路径的方法有多种&#xff0c;主要通过以下1、使用相对路径、2、使用环境变量、3、使用webpack配置三种方式来实现。这些方法可以帮助开发者在项目中更灵活地使用静态资源。下面将详细解释每种方法以及如何使用它们。 一、使用相对路径 在Vue项目中&#…