当前位置: 首页 > news >正文

代码随想录算法训练营第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; // 返回最大子数组和}

感悟

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

相关文章:

  • C语言 图的基础知识
  • HTTP/2 协议学习
  • VMware ESXi 8.0U2c macOS Unlocker OEM BIOS ConnectX-3 网卡定制版 (集成驱动版)
  • 流程图工具评测:十大热门软件对比
  • Spring Boot 中如何解决跨域问题、Spring Cloud 5大组件、微服务的优缺点是什么?
  • 模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类
  • 【软件测试】软件测试入门
  • AOSP开发环境搭建
  • 志愿服务管理系统的设计
  • 【全网最全最详细】RabbitMQ面试题
  • 【Go】用 DBeaver、db browser 和 SqlCipher 读取 SqlCipher 数据库
  • Java基础16(集合框架 List ArrayList容器类 ArrayList底层源码解析及扩容机制)
  • C++ unique_ptr
  • ESP8266发送WOL幻数据包实现电脑远程唤醒
  • <router-view />标签的理解
  • centos安装java运行环境jdk+tomcat
  • exif信息对照
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • javascript从右向左截取指定位数字符的3种方法
  • JavaScript实现分页效果
  • leetcode-27. Remove Element
  • spring boot下thymeleaf全局静态变量配置
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Vue官网教程学习过程中值得记录的一些事情
  • vue中实现单选
  • win10下安装mysql5.7
  • 程序员最讨厌的9句话,你可有补充?
  • 大快搜索数据爬虫技术实例安装教学篇
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 免费小说阅读小程序
  • 前端面试之CSS3新特性
  • 如何设计一个微型分布式架构?
  • 如何在 Tornado 中实现 Middleware
  • 小程序开发之路(一)
  • 自定义函数
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 阿里云服务器购买完整流程
  • # wps必须要登录激活才能使用吗?
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • (12)目标检测_SSD基于pytorch搭建代码
  • (C语言)fread与fwrite详解
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (k8s)kubernetes 部署Promehteus学习之路
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转)Sublime Text3配置Lua运行环境
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本