代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和

news2024/7/6 19:38:44

代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和

文章链接:分发饼干        摆动序列        最大子数组和

视频链接:分发饼干        摆动序列        最大子数组和

目录

代码随想录算法训练营第三十一天 | LeetCode 455. 分发饼干、376. 摆动序列、53. 最大子数组和

1. 贪心算法理论基础

1.1 什么是贪心

1.2 什么时候用贪心

1.3 贪心一般解题步骤

2. LeetCode 455. 分发饼干

2.1 思路

2.2 代码

3. LeetCode 376. 摆动序列

3.1 思路

3.2 代码

4. LeetCode 53. 最大子数组和

4.1 思路

4.2 代码


1. 贪心算法理论基础

1.1 什么是贪心

贪心的本质是选择每一阶段的局部最优,从而达到全局最优

1.2 什么时候用贪心

说实话贪心算法并没有固定的套路。所以唯一的难点就是如何通过局部最优,推出整体最优。

那么如何能看出局部最优是否能推出整体最优呢?有没有什么固定策略或者套路呢?也没有!靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。

如何验证可不可以用贪心算法呢?最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧

1.3 贪心一般解题步骤

  1. 将问题分解为若干个子问题
  2. 找出适合的贪心策略
  3. 求解每一个子问题的最优解
  4. 将局部最优解堆叠成全局最优解

做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。

贪心没有套路,说白了就是常识性推导加上举反例

2. LeetCode 455. 分发饼干

2.1 思路

2.2 代码

//
class Solution {
    // 思路1:优先考虑饼干,小饼干先喂饱小胃口
    public int findContentChildren(int[] g, int[] s) {
        Arrays.sort(g);
        Arrays.sort(s);
        int start = 0;
        int count = 0;
        for (int i = 0; i < s.length && start < g.length; i++) {
            if (s[i] >= g[start]) {
                start++;
                count++;
            }
        }
        return count;
    }
}

3. LeetCode 376. 摆动序列

3.1 思路

3.2 代码

//
class Solution {
    public int wiggleMaxLength(int[] nums) {
        if (nums.length <= 1) {
            return nums.length;
        }
        //当前差值
        int curDiff = 0;
        //上一个差值
        int preDiff = 0;
        int count = 1;
        for (int i = 1; i < nums.length; i++) {
            //得到当前差值
            curDiff = nums[i] - nums[i - 1];
            //如果当前差值和上一个差值为一正一负
            //等于0的情况表示初始时的preDiff
            if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
                count++;
                preDiff = curDiff;
            }
        }
        return count;
    }
}

4. LeetCode 53. 最大子数组和

4.1 思路

  1. 题目是给一个数组求最大连续子数组的和,注意是要求连续的。连续和+=nums[i]

  2. 局部最优:如果连续和在某个位置后是负数,如果还+=nums[i]只会让nums[i]变小,与其继续要前面的连续和,不如直接让连续和变为0再重新+=nums[i],重新开始遍历。因此局部最优就是如果求解连续和时连续和为负数,直接抛弃它,因为只会拖累我们的总和

  3. 全局最优:在数组中找到了最大连续子数组的和。从这个局部最优好像可以推出全局最优,而且找不到明显的反例反驳这个想法,因此可以试一下这个贪心思路

  4. 注意:我们是当连续和为负数时才将连续和置为0重新开始遍历,而不是遇到数组中的一个负数就置为0,因为加了这个负数连续和还可能是负数

  5. 定义个result记录最终结果最大值,初始化为Integer.MIN_VALUE。定义个count记录连续和。result就是用count更新为最大的结果

  6. for(int i=0; i<nums.length; i++),在循环中,count+=nums[i],if(count>result),result=count就更新为最新的最大值。if(count<0),就把count=0重新开始遍历。最后return result就行了

4.2 代码

//
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 <= 0){
                count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
            }
        }
       return sum;
    }
}

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

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

相关文章

第三章 C++的循环结构

系列文章目录 第一章 C的输入第二章 C的输出 文章目录 系列文章目录前言一、个人名片二、while三、do-while四、for总结 前言 今天来学循环结构&#xff01; 一、个人名片 个人主页&#xff1a;睡觉觉觉得 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评…

怎样正确进行全链路压测?

全链路压测是确保软件系统稳健性和性能的关键一环。通过全面评估整个系统的性能&#xff0c;并在生产环境之前发现和解决问题&#xff0c;可以提高系统的可用性、用户满意度&#xff0c;并降低潜在的风险。本文将介绍怎样正确进行全链路压测! 确定测试目标&#xff1a;首先&…

异步编程详解(.NET)

在之前写的一篇关于async和await的前世今生的文章之后&#xff0c;大家似乎在async和await提高网站处理能力方面还有一些疑问&#xff0c;很多网站本身也做了不少的尝试。今天我们再来回答一下这个问题&#xff0c;同时我会做一个async和await在WinForm中的尝试&#xff0c;并且…

hackmyvm之gift

hackmyvm是一个平台&#xff0c;包含了大量靶机&#xff0c;类似于vulnhub、hackthebox等平台&#xff0c;你可以在上面下载靶机&#xff0c;进行渗透测试练习&#xff0c;非常适合热爱黑客技术或从事渗透测试的人员。 &#xff08;这段解释参考这篇文章&#xff09; 下载安装…

一键运行大语言模型服务,搭建聊天应用

前言 本文介绍一个可以快速搭建本地大语言模型的聊天服务&#xff0c;模型和代码已全部提供&#xff0c;不需要联网运行。项目使用的是Qwen-7B-Int4模型&#xff0c;只需要8G显存的显卡都能流畅运行&#xff0c;无论是Windows还是Linux系统都支持使用。 安装环境 安装GPU版本…

PyTorch 与 TensorFlow:机器学习框架之战

深度学习框架是简化人工神经网络 (ANN) 开发的重要工具&#xff0c;并且其发展非常迅速。其中&#xff0c;TensorFlow 和 PyTorch 脱颖而出&#xff0c;各自在不同的机器学习领域占有一席之地。但如何为特定项目确定理想的工具呢&#xff1f;本综合指南[1]旨在阐明它们的优点和…

基于粒子群算法的无人机航迹规划-附代码

基于粒子群算法的无人机航迹规划 文章目录 基于粒子群算法的无人机航迹规划1.粒子群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用粒子群算法来优化无人机航迹规划。 1.粒子群…

电脑软件:推荐一款非常强大的pdf阅读编辑软件

目录 一、软件简介 二、功能介绍 1、界面美观&#xff0c;打开速度快 2、可直接编辑pdf 3、非常强大好用的注释功能 4、很好用的页面组织和提取功能 5、PDF转word效果非常棒 6、强大的OCR功能 三、软件特色 四、软件下载 pdf是日常办公非常常见的文档格式&#xff0c;…

WPF Material Design UI框架

前言 Material Design in xaml 是开源免费的ui框架&#xff0c;工控软件主打的就是简单界面。 以下简称MD 相关资源 MaterialDesignInXamlToolkit Github 地址 MD 快速启动 MD 案例压缩包 MD 框架使用 启动环境配置 安装Nuget包 App.xaml 配置 <Application x:Class&qu…

利用dns协议发起ddos反射攻击

利用DNS服务器发起反射型DDOS&#xff0c;攻击带宽 基本思路&#xff1a; 1、利用any类型的dns查询&#xff0c;可完成发送少量请求数据&#xff0c;获得大量返回数据。 2、将原请求地址改为受害者地址&#xff0c;则dns会向受害者返回大量数据&#xff0c;占用带宽 警告&…

计算机网络之数据链路层

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…

现代C++、STL、QTL的使用

0、现代C中最重要的是&#xff1a; 右值引用、移动语义、完美转发、万能引用 1、std::vector、QVector 2、std::list、QList 3、std::map、QMap 4、std::multimap、QMultiMap 5、std::tuple &#xff08;1&#xff09;创建&#xff1a; std::tuple<T1, T2, TN>…

7.21 SpringBoot项目实战【图书借阅】并发最佳实践:细粒度Key锁、数据库乐观锁、synchronized、ReentrantLock

文章目录 前言一、编写服务层二、编写控制器三、并发实战1. synchronized关键字2. Lock 接口3. Atomic类4. 细粒度Key锁5. 数据库乐观锁6. 最终service完整代码 最后 前言 上文的产品设计流程&#xff1a;查看图书列表 7.3 实现-》查看图书详情上文7.20 -》图书借阅(本文)。 就…

【微服务】Feign 整合 Sentinel,深入探索 Sentinel 的隔离和熔断降级规则,以及授权规则和自定义异常返回结果

文章目录 前言一、Feign 整合 Sentinel1.1 实现步骤1.2 FallbackFactory 示例 二、Sentinel 实现隔离2.1 隔离的实现方法2.2 Sentinel 实现线程隔离示例 三、熔断降级规则3.1 熔断降级原理及其流程3.2 熔断策略 —— 慢调用3.3 熔断策略 —— 异常比例和异常数 四、授权规则4.1…

今年这行情,不会自动化的要做好心理准备了

李强是一名软件测试工程师&#xff0c;入行之后在一家小型公司工作了五年。这段时间里&#xff0c;他主要负责手工测试和一些简单的自动化测试工作。由于公司项目也相对简单&#xff0c;他逐渐陷入了工作的舒适区&#xff0c;没有积极追求新的知识和技能。 然而随着身边朋友发展…

MD5生成和校验

MD5生成和校验 2021年8月19日席锦 任何类型的一个文件&#xff0c;它都只有一个MD5值&#xff0c;并且如果这个文件被修改过或者篡改过&#xff0c;它的MD5值也将改变。因此&#xff0c;我们会对比文件的MD5值&#xff0c;来校验文件是否是有被恶意篡改过。 什么是MD5&#xff…

Docker Swarm 集群搭建

Docker Swarm Mode Docker Swarm 集群搭建 Docker Swarm 节点维护 Docker Service 创建 1.准备主机 搭建一个 docker swarm 集群&#xff0c;包含 5 个 swarm 节点。这 5 个 swarm 节点的 IP 与暂 时的角色分配如下&#xff08;注意&#xff0c;搭建完成后会切换角色&#xff…

winscp连接虚拟机过程

1、winscp安装 安装winscp&#xff1a;winscp安装 2、winscp连接虚拟机 参考链接&#xff1a;WinSCP怎么连接虚拟机 执行ifconfig查看主机ip 可见192.168.187.129即为虚拟机地址。执行 netstat -ntpl 启动网络连接后&#xff0c;即可进行winscp连接。 过程中可能遇到以下问…

vue v-for

目录 前言&#xff1a;Vue.js 中的 v-for 指令 详解&#xff1a;v-for 指令的基本概念 用法&#xff1a;v-for 指令的实际应用 1. 列表渲染 2. 动态组件 3. 表单选项 4. 嵌套循环 5. 键值对遍历 解析&#xff1a;v-for 指令的优势和局限性 优势&#xff1a; 局限性&a…

通义大模型使用指南之通义千问

一、注册 我们可以打开以下网站&#xff0c;用手机号注册一个账号即可。 通义大模型 (aliyun.com) 二、使用介绍 如图&#xff0c;我们可以看到有三个大项功能&#xff0c;通义千问、通义万相、通义听悟。下来我们体验一下通义千问的功能。 1、通义千问 通义千问主要有两个功能…