代码随想录算法训练营第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调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.