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

本文主要是介绍代码随想录算法训练营第29天(贪心)|455.分发饼干、376. 摆动序列、53. 最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

455.分发饼干

在这里插入图片描述

题目链接:455.分发饼干
文档讲解:代码随想录
状态:so easy

思路:对胃口和饼干大小排序,小胃口对应小饼干,不满足的话用下一块饼干试探。

题解:

    public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count = 0;int i = 0, j = 0;while (i < g.length && j < s.length) {if (s[j] >= g[i]) {count++;i++;}j++;}return count;}

376. 摆动序列

在这里插入图片描述

题目链接:376. 摆动序列
文档讲解:代码随想录
状态:不会,总是有一些我想不到的情况出现

思路:如图
在这里插入图片描述

动态规划题解:

class Solution {/*** 输入:nums = [1,17,5,10,13,15,10,5,16,8]*          1, 17,  5, 10, 13, 15, 10,  5, 16,  8*             升   降  升  升  升   降   降  升  降*  降序结尾 0  0   2   2   2   2   4    4   4   6*  升序结尾 0  1   1   3   3   3   3    5   5   5*  if 升 {*     dp[i][降] = dp[i-1][降]*     dp[i][升] = dp[i-1][降]+1*  }*  if 降{*      dp[i][降] = dp[i-1][升]+1*      dp[i][升] = dp[i-1][升]*  }** @param nums* @return*/public int wiggleMaxLength(int[] nums) {int[][] dp = new int[nums.length][2];int i = 1;for (; i < nums.length; i++) {//dp[i][0]降序结尾//dp[i][1]升序结尾if (nums[i] > nums[i-1]){dp[i][0] = dp[i-1][0];dp[i][1] = dp[i-1][0]+1;}else if (nums[i] < nums[i-1]){dp[i][0] = dp[i-1][1]+1;dp[i][1] = dp[i-1][1];}else{//相等dp[i][0] = dp[i-1][0];dp[i][1] = dp[i-1][1];}}return Math.max(dp[--i][0],dp[i][1])+1;}
}

贪心题解:

   public int wiggleMaxLength(int[] nums) {// 如果数组为空或长度小于2,直接返回数组的长度if (nums.length < 2) {return nums.length;}// 初始化两个变量,分别表示上升和下降摆动序列的长度int up = 1;int down = 1;// 遍历数组,从第二个元素开始for (int i = 1; i < nums.length; i++) {if (nums[i] > nums[i - 1]) {// 当前元素大于前一个元素,表示上升摆动up = down + 1; // 上升摆动序列长度为之前下降摆动序列长度加1} else if (nums[i] < nums[i - 1]) {// 当前元素小于前一个元素,表示下降摆动down = up + 1; // 下降摆动序列长度为之前上升摆动序列长度加1}// 如果当前元素等于前一个元素,则跳过,不做任何操作}// 返回上升和下降摆动序列长度的较大值,即为最大摆动序列长度return Math.max(up, down);}

53. 最大子序和

在这里插入图片描述

题目链接:53. 最大子序和
文档讲解:代码随想录
状态:画蛇添足了,写了两层循环,内层循环的思路已经满足题解了,结果还加了一层循环,结果超时了。。。

错误代码:

    public int maxSubArray(int[] nums) {int max = nums[0];for (int i = 0; i < nums.length; i++) {int sum = 0;for (int j = i; j < nums.length; j++) {sum += nums[j];if (sum <= 0) {i = j + 1;sum = 0;}max = Math.max(max, sum);}}return max;}

思路:首先1 <= nums.length <= 105,只能使用nlogn及以下的算法。

  • 贪心:将大问题划分成小问题,从第一个数字观察什么时候求和是有效的呢?那就是从第一个数字开始加上后面的数字,如果使sum小于0了,那还不如不加,然后就可以从该位置开始重新求sum,在这个过程中记录max。
  • 动态规划:通过定义状态 dp[i] 表示以第 i 个元素结尾的子数组的最大和,并通过状态转移方程 dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]) 来更新每个位置的最大子数组和,同时维护一个变量 maxSum 记录全局最大值。
    在这里插入图片描述
    贪心题解:
    public int maxSubArray(int[] nums) {int max = nums[0]; // 初始最大子数组和为数组第一个元素int sum = 0; // 当前子数组的和for (int j = 0; j < nums.length; j++) {sum += nums[j]; // 将当前元素加入到当前子数组和中max = Math.max(max, sum); // 更新最大子数组和if (sum <= 0) {sum = 0; // 如果当前子数组和小于等于0,重新开始计算新的子数组}}return max; // 返回最大子数组和}

动态规划题解:

	public int maxSubArray(int[] nums) {int ans; // 存储最终结果的变量int[] dp = new int[nums.length]; // dp数组,dp[i]表示以第i个元素结尾的子数组的最大和dp[0] = nums[0]; // 初始化dp数组的第一个元素为nums[0]ans = dp[0]; // 初始化最终结果为dp[0]// 遍历数组,计算dp数组和最终结果for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); // 状态转移方程,选择加上当前元素或者从当前元素重新开始ans = Math.max(dp[i], ans); // 更新最终结果}return ans; // 返回最大子数组和}

感悟

很多时候直接想出贪心策略可能有点难,感觉动态规划的状态转移思想可以启发贪心策略的设计。

这篇关于代码随想录算法训练营第29天(贪心)|455.分发饼干、376. 摆动序列、53. 最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079493

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元