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

news2024/10/23 4:59:03

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; // 返回最大子数组和
	}

感悟

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843573.html

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

相关文章

自动化测试Robot FrameWork框架

一、简介 Robot FrameWork是完全基于Python实现的开源的自动化测试框架&#xff0c;RF已经封装好的各个模块&#xff0c;基于关键字驱动的形式来实现的自动化测试。其case采用表格形式易读&#xff0c;且支持BDD&#xff0c;可容纳各种外置库&#xff0c;可以继承Selenium、Ap…

【机器学习】基于稀疏识别方法的洛伦兹混沌系统预测

1. 引言 1.1. DNN模型的来由 从数据中识别非线性动态学意味着什么&#xff1f; 假设我们有时间序列数据&#xff0c;这些数据来自一个&#xff08;非线性&#xff09;动态学系统。 识别一个系统意味着基于数据推断该系统的控制方程。换句话说&#xff0c;就是找到动态系统方…

【etcd】etcd单机安装及简单操作

https://blog.csdn.net/Mr_XiMu/article/details/125026635 https://blog.csdn.net/m0_73192864/article/details/136509244 etcd在生产环境中一般为集群方式部署 etcd使用的2个默认端口号&#xff1a;2379和2380 2379&#xff1a;用于客户端通信(类似于sqlserver的1433&#x…

视频融合共享平台LntonCVS视频监控安防系统运用多视频协议建设智慧园区方案

智慧园区&#xff0c;作为现代化城市发展的重要组成部分&#xff0c;不仅推动了产业的升级转型&#xff0c;也成为了智慧城市建设的核心力量。随着产业园区之间的竞争日益激烈&#xff0c;如何打造一个功能完善、智能化程度高的智慧园区&#xff0c;已经成为了业界广泛关注的焦…

五十、openlayers官网示例JSTS Integration解析——使用JSTS 库来处理几何缓冲区并在地图上显示结果

官网demo地址&#xff1a; JSTS Integration 这篇讲了如何在地图上添加缓冲图形 什么叫做缓冲几何&#xff1f; 几何缓冲&#xff08;Geometric Buffering&#xff09;是指在 GIS&#xff08;地理信息系统&#xff09;和计算几何中&#xff0c;围绕一个几何对象创建一个具有…

时空预测 | 基于深度学习的碳排放时空预测模型

时空预测 模型描述 数据收集和准备&#xff1a;收集与碳排放相关的数据&#xff0c;包括历史碳排放数据、气象数据、人口密度数据等。确保数据的质量和完整性&#xff0c;并进行必要的数据清洗和预处理。 特征工程&#xff1a;根据问题的需求和领域知识&#xff0c;对数据进行…

Walrus:去中心化存储和DA协议,可以基于Sui构建L2和大型存储

Walrus是为区块链应用和自主代理提供的创新去中心化存储网络。Walrus存储系统今天以开发者预览版的形式发布&#xff0c;面向Sui开发者征求反馈意见&#xff0c;并预计很快会向其他Web3社区广泛推广。 通过采用纠删编码创新技术&#xff0c;Walrus能够快速且稳健地将非结构化数…

5款堪称变态的AI神器,焊死在电脑上永不删除!

一 、AI视频合成工具——Runway&#xff1a; 第一款RunWay&#xff0c;你只需要轻轻一抹&#xff0c;视频中的元素就会被擦除&#xff0c;再来轻轻一抹&#xff0c;直接擦除&#xff0c;不喜欢这个人直接擦除&#xff0c;一点痕迹都看不出来。 除了视频擦除功能外&#xff0c;…

第一个Neety程序

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Netty ⛺️稳中求进&#xff0c;晒太阳 加入依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.39.F…

【Spine学习10】之 创建新骨骼时,自动绑定图片和插槽的快捷方式

两天没更新了。 遇到一些难解的难题 用的版本是破解版 不知道为啥现在的教程非常地快 明明有些细节很重要还略过讲 所以创建骨骼这里 基本创建是都会 可是骨骼一多 实际工作中的重命名也太麻烦了 。 这就需要学习快捷创建方式&#xff1a; <将对应图片自动绑定到新骨骼上并…

哔哩哔哩视频URL解析原理

哔哩哔哩视频URL解析原理 视频网址解析视频的原理通常涉及以下几个步骤&#xff1a; 1、获取视频页面源代码&#xff1a;通过HTTP请求获取视频所在网页的HTML源代码。这一步通常需要处理反爬虫机制&#xff0c;如验证码或用户登录。 2、解析页面源代码&#xff1a;分析HTML源代…

【上海交大】博士生年度进展报告模板

上海交通大学 博士生年度进展报告模板 比较不好找&#xff0c;在交我办中发起申请流程后才能看到链接&#xff0c;链接如下&#xff1a; https://www.gs.sjtu.edu.cn/xzzx/pygl/15

byte[]转MultipartFile、byte[]转File一次看个够

目录 需求背景 当你需要将byte[]、MultipartFile、File实现互转时&#xff0c;无外乎以下场景&#xff1a; 保存第三方接口返回二进制流前/后端文件流上传微服务间调用文件格式转换 正如你所需要的&#xff0c;通过搜索引擎筛选到我的本篇文章是因为你在开发中需要将byte[]转…

剑指offer 算法题(数组中重复的数据)

剑指offer 第一题 去力扣里测试算法 思路一&#xff1a; 排序后&#xff0c;前一个与后一个相比是否相同。 class Solution { public:vector<int> findDuplicates(vector<int>& nums) {sort(nums.begin(), nums.end());int n 0;int len nums.size();vect…

如何设计一个点赞系统

首先我们定义出一个点赞系统需要对外提供哪些接口&#xff1a; 1.用户对特定的消息进行点赞&#xff1b; 2.用户查看自己发布的某条消息点赞数量以及被哪些人赞过&#xff1b; 3.用户查看自己给哪些消息点赞过&#xff1b; 这里假设每条消息都有一个message_id, 每一个用户都…

文件防篡改监控工具 - WGCLOUD全面介绍

WGCLOUD是一款优秀的运维监控软件&#xff0c;免费、轻量、高效&#xff0c;部署容易&#xff0c;上手简单&#xff0c;对新手非常友好 WGCLOUD部署完成后&#xff0c;点击菜单【文件防篡改】&#xff0c;可以看到如下页面 我们点击【添加】按钮&#xff0c;输入监控文件的信息…

python之Bible快速检索器

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! python之Bible快速检索器 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快…

【网络安全的神秘世界】已解决Failed to start proxy service on 127.0.0.1:8080

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 解决burpsuite无法在 127.0.0.1&#xff1a;8080 上启动代理服务端口被占用以及抓不到本地包的问题 Burpsuite无法启动proxy…

ISSN和CN到底有什么不同呢?

在学术出版领域&#xff0c;我们常常会遇到各种标识码&#xff0c;其中ISSN和CN无疑是两个最为常见的。尽管它们都是用于标识出版物的重要信息&#xff0c;但两者在定义、功能和应用上却有着显著的区别。那么&#xff0c;ISSN和CN到底有什么不同呢&#xff1f;接下来&#xff0…

深度解析RocketMq源码-持久化组件(四) CommitLog

1.绪论 commitLog是rocketmq存储的核心&#xff0c;前面我们介绍了mappedfile、mappedfilequeue、刷盘策略&#xff0c;其实commitlog的核心组件我们基本上已经介绍完成。 2.commitLog的组成 commitLog的核心其实就是MqppedFilequeue&#xff0c;它本质上就是多个mappedFile…