今日总结:

        摆动序列的三种特殊情况需要着重思考,感觉是没有思考清楚

基础理论

        1、贪心的本质:

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

                例如:一堆钞票,只能拿走10张,如何拿走最多的金额?:每次拿最大的(局部最优),最后就是拿走最多的金额(全局最优)

       2、 贪心的套路:

                贪心算法没有固定的套路。

                难点:如何通过局部最优推理出全局最优(也没有具体的套路)

                如何验证可不可以使用贪心算法:

                        举反例,如果想不到反例就可以尝试使用贪心算法

        3、贪心的一般解题思路(鸡肋,实际做题不能按照这个考虑):

                (1)将问题分解为若干个子问题

                (2)找出适合的贪心策略

                (3)求解每一个子问题的最优解

                (4)将局部最优解堆叠成全局最优解

                实际做题中,只需要考虑局部最优是什么,如何推导出全局最优

分发饼干

题目链接:455. 分发饼干 - 力扣(LeetCode)

总体思路:

        将每一块饼干都能够给到适合的孩子,就能达到尽可能多的孩子。

        所以,将饼干从小到大排序, 对孩子的胃口值也从小到大排序,尽量将每一块小饼干都能分给对应的小孩子。

总体代码:

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {//对两者都进行排序sort(g.begin(),g.end());sort(s.begin(),s.end());//一个记录分配的变量int sum=0;//遍历饼干,从最小的胃口值开始分配for(int i=0,j=0;j<s.size();j++){if(i<g.size()&&s[j]>=g[i]){//满足胃口值,满足局部最合适,进行下一个孩子,同时记录i++;sum++;}}return sum;}
};

摆动序列

题目链接:376. 摆动序列 - 力扣(LeetCode)

总体思路:

        1、首先理解摆动序列的含义:连续数字之间的差严格的在正数和负数之间交替,则这个数字序列称为摆动序列,少于两个元素的序列也是摆动序列。

        2、目标:

                (1)现在给定的序列是一个未知的序列:

                (2)需要通过删除最少的元素去获得最大的摆动序列,

                (3)且不能改变元素的原本位置。

        3、方法:贪心算法:通过局部最优推导全局最优

                (1)局部最优:删除单调坡度上的节点(顶、谷不删除),那么这个坡度就有两个局部峰值。

                (2)全局最优:整个序列拥有最多的局部峰值--->达到最长的摆动序列

        4、寻找峰值情况的讨论

                (1)上下坡中有平坡

                        需要删除(不统计)平坡的前边,只保留最后一个峰或者谷[i]-[i-1]<=0&&[i+1]-[i]>0或者[i]-[i-1]>=0&&[i+1]-[i]<0才记录

                (2)数组首尾两端的记录方法

                        因为现在讨论的是通过当前的点与上一个点、下一个点的差获得当前是不是峰谷,所以对于数组首尾的特殊(首没有前一个元素,尾没有下一个元素),可以通过假设数组前还有一个与首相同的元素,即默认峰值是1开始计算。

                        相当于提前记录一个左边的端点,去记录的第二个值是左端点与右端点的峰,没有记录右端点

                (3)单调坡中有平坡

                        在第(1)种中讨论了上下坡中有平坡,处理方法是不去记录前边平的位置,但是在单调的坡中如果有平坡,可能会记录上平坡的右边位置,导致位置变多,所以需要在每次获取到当前位置的左右坡度后,需要将左边的坡度=右边的坡度,在下次计算的时候就会处理掉单调坡有平坡的现象。

                        相当于只记录峰值变化,只要没有出现峰值,就不去记录,也就是将前一个峰值的坡度记录下来,只要当前坡度不相反,就不去记录。

总体代码:

class Solution {
public://核心寻找局部最优,即不记录坡度中的值,只记录峰值//需要注意三点://(1)坡度有平坡的现象//(2)对于起始与结束的位置(因为要三个点比较)//(3)对于单调的坡中存在平坡现象int wiggleMaxLength(vector<int>& nums) {int length =1;//记录长度,从1开始,因为除去起始位置的默认坡度int pre=0;int cur=0;//定义当前的坡度for(int i=0;i<nums.size()-1;i++)//因为默认左端点前有一个与左端点一样的值,不去记录右端点的位置了{   //使用cur去更新pre,从而避免单调坡中出现平坡的问题if(nums.size()<1)return length;//记录当前的坡度cur = nums[i+1]-nums[i];if((pre<=0&&cur>0)||(pre>=0&&cur<0)){length++;//更新前一个坡度,只有在记录峰值的时候才会更新坡度,不是每次计算cur都更新前一个的坡度pre = cur;}}return length;}
};

最大子序和

题目链接:53. 最大子数组和 - 力扣(LeetCode)

总体思路:

        序列中存在正数、负数,求这个序列中的连续的子序列最大的和:所以要着重注意负数的影响,因为正数总是将和增大,负数会将和减小 

        如果从某个值开始的子序列的和为负数了:说明当前值是一个负数,且与之前子序列的和加起来都要小于0,这个数只会影响整体的和,所以直接跳过当前的这个负数,从下一个值重新记录子序列的和。

        但是如果只是加上一个小的负数,整体结果仍旧大于0,不能重新开始记录,因为后边如果有大的正数,会使整体子序列的和变得更大。

        所以,只有当前子序列的和为负数的时候,才从当前值的下一个值开始记录子序列的和,也就是贪心思想,局部的最大,推导出全局的最大。

总体代码:

class Solution {
public://最大和肯定和负值有关系,因为正值只会增加和//当目前的和小于0,就要舍弃,从新计算连续子序列的和(当前负数比之前所有的数之和都小,一定不能带这个负数,不如后边的自己相加)int maxSubArray(vector<int>& nums) {int sum = INT_MIN;//记录最大的和int cur_sum = 0;//记录当前的和for(int i=0;i<nums.size();i++){cur_sum += nums[i];//判断当前的子序列的和是不是大于sumsum = sum >cur_sum?sum : cur_sum;if(cur_sum<0) cur_sum=0;}return sum;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Q-chunking——带有动作分块的强化学习:基于人类演示,进行一定的连贯探索(且可做到无偏的n步价值回溯)

前言 我在之前的文章中提到过多次&#xff0c;长沙具身团队是我司建设的第二支具身团队&#xff0c;通过5月份的全力招聘&#xff0c;为了冲刺6月底和7月初来长沙办公室考察的第一批客户&#xff0c;过去一个多月来&#xff0c;长沙分部(一开始就5人&#xff0c;另外5人 实习…

NW956NW961美光固态闪存NW964NW968

美光固态闪存深度解析&#xff1a;NW956、NW961、NW964与NW968的全方位评测一、产品概述与市场定位在当今数据爆炸的时代&#xff0c;固态硬盘&#xff08;SSD&#xff09;作为存储领域的佼佼者&#xff0c;其性能与稳定性成为了用户关注的焦点。美光&#xff08;Micron&#x…

C++修炼:IO流

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《C修炼之路》、《Linux修炼&#xff1a;终端之内 洞悉真理…

语音识别的速度革命:从 Whisper 到 Whisper-CTranslate2,我经历了什么?

Whisper-CTranslate2&#xff1a;语音识别的速度革命 大家好&#xff0c;一个沉迷于 AI 语音技术的 “音频猎人”。最近在处理大量播客转录项目时&#xff0c;我被传统语音识别工具折磨得苦不堪言 ——RTX 3090 跑一个小时的音频要整整 20 分钟&#xff0c;服务器内存分分钟爆满…

JVM 内存模型详解:GC 是如何拯救内存世界的?

JVM 内存模型详解&#xff1a;GC 是如何拯救内存世界的&#xff1f; 引言 Java 虚拟机&#xff08;JVM&#xff09;是 Java 程序运行的基础&#xff0c;其核心特性之一就是自动内存管理。与 C/C 不同&#xff0c;Java 开发者无需手动分配和释放内存&#xff0c;而是由 JVM 自动…

分布式全局唯一ID生成:雪花算法 vs Redis Increment,怎么选?

在黑马点评项目实战中&#xff0c;关于全局唯一ID生成的实现方案选择中&#xff0c;我看到有人提到了雪花算法&#xff0c;本文就来简单了解一下雪花算法与Redis的incr方案的不同。在分布式系统开发中&#xff0c;“全局唯一ID”是绕不开的核心问题。无论是分库分表的数据库设计…

(新手友好)MySQL学习笔记(完):事务和锁

事务和锁事务transaction&#xff0c;一组原子性的SQL查询&#xff0c;或者说是一个独立的工作单元。如果能够成功执行这组查询的全部语句&#xff0c;就会执行这组查询&#xff1b;如果其中任何一条语句无法成功执行&#xff0c;那么这组查询的所有语句都不会执行。也就是说&a…

【CMake】使用 CMake 将单模块 C 项目构建为库并链接主程序

目录1. 项目结构设计&#x1f4e6; 结构说明2. 项目文件内容2.1 顶层 CMakeLists.txt2.2 模块 src/color/CMakeLists.txt ✅【推荐写法】❓是否需要写 project()&#xff1f;2.3 模块头文件 include/color.h2.4 模块实现文件 src/color/color.c2.5 主程序 src/main.c3. 构建与运…

从零开始的云计算生活——番外4,使用 Keepalived 实现 MySQL 高可用

目录 前言 一、架构原理​ ​Keepalived 作用​ ​MySQL 主从复制​ 二、环境准备​ 服务器要求​&#xff1a; 安装基础软件​ 三、配置 MySQL 主从复制 四、配置 Keepalived 主节点配置​&#xff08;/etc/keepalived/keepalived.conf&#xff09; 从节点配置 五、…

list类的常用接口实现及迭代器

目录 1. list类的介绍 2.list类的常用接口 2.1 list类的常用构造 2.2 list类对象的容量操作 2.3 list迭代器 2.4 list类的常用操作 3.list的模拟实现 1. list类的介绍 list代表的是双向链表&#xff0c;常见的有创建&#xff0c;增&#xff0c;删&#xff0c;改几个接口…

vscode Cline接入火山引擎的Deepseek R1

创建火山引擎Deepseek R1的API 在火山引擎管理控制台中创建Deepseek R1推理接入点&#xff08;大模型&#xff09;&#xff0c;创建成功后会看到下图效果。在操作中选择API调用&#xff0c;在页面中选择OpenAI SDK&#xff0c;按照步骤找到baseUrl地址和API_KEY&#xff0c;后续…

新手向:自动化图片格式转换工具

大家好&#xff01;今天我要分享一个非常实用的Python小工具——图片格式批量转换器。如果你经常需要处理大量不同格式的图片文件&#xff0c;或者需要统一图片格式以便于管理&#xff0c;那么这个工具将会成为你的得力助手&#xff01;一、为什么需要图片格式转换&#xff1f;…

CUDA中的内存管理、锁页内存、UVA统一虚拟地址、零拷贝、统一内存

文章目录0 前言1 swap内存跟锁页内存2 UVA(Unified Virtual Addressing)统一虚拟地址3 先看最普通的cuda内存分配、释放、传输4 申请锁页内存4.1 cudaHostAllocDefault4.2 cudaHostAllocPortable4.3 cudaHostAllocWriteCombined4.3 cudaHostAllocMapped4.4 几种锁页内存总结4.5…

微服务环境下的灰度发布与金丝雀发布实战经验分享

微服务环境下的灰度发布与金丝雀发布实战经验分享 在大规模微服务架构中&#xff0c;如何平滑安全地上线新功能是每个后端团队的痛点。本文将结合生产环境中的真实案例&#xff0c;分享灰度发布&#xff08;Gray Release&#xff09;与金丝雀发布&#xff08;Canary Release&am…

MEF 在 WPF 中的简单应用

MEF核心笔记MEF 的开发模式主要适用于插件化的业务场景中&#xff0c;C/S 和 B/S 中都有相应的使用场景&#xff0c;其中包括但不限于 ASP.NET MVC 、ASP WebForms、WPF、UWP 等开发框架。当然&#xff0c;DotNet Core 也是支持的。 以下是搜索到一些比较好的博文供参考&#…

Gitlab跑CICD的时候,maven镜像和pom.xml使用的maven版本冲突导致没办法build成功的解决方法

是这样的&#xff01;最近遇到一个非常棘手的难题&#xff0c;我搞了大概2周时间才把他弄出来&#xff0c;因为自己搭了个私服的maven仓库&#xff0c;他不像maven官方仓库一样&#xff0c;可以跟nginx一样转的&#xff0c;所以遇到好几个难点&#xff01;第一点&#xff1a;就…

Linux内核IPv4路由查找:LPC-Trie算法的深度实践

在互联网基础设施的核心领域,路由查找性能直接决定了网络转发效率。Linux内核作为现代网络系统的基石,其IPv4路由子系统采用了一种名为LPC-Trie(Level-Compressed Trie) 的创新数据结构,在net/ipv4/fib_trie.c文件中实现了高效的路由管理方案。本文将深入剖析这一机制的设…

【设计模式】装饰(器)模式 透明装饰模式与半透明装饰模式

装饰模式&#xff08;Decorator Pattern&#xff09;详解一、装饰模式简介 装饰模式&#xff08;Decorator Pattern&#xff09; 是一种 结构型设计模式&#xff0c;它允许你动态地给对象添加行为或职责&#xff0c;而无需修改其源代码&#xff0c;也不需要使用继承来扩展功能。…

NAT原理与实验指南:网络地址转换技术解析与实践

NAT实验 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;&#xff1a; NAT技术的介绍&#xff1a; 随着Internet用户的快速增长&#xff0c;以及地址分配不均等因素&#xff0c;IPv4地址&#xff08;约40亿的空间地址&#xff09;已经陷入不…

设计模式之【观察者模式】

目录 观察者模式中的角色 通过一个简单案例来演示观察者模式 被观察者接口 事件类型 up主类作为被观察者 观察者接口 粉丝类作为观察者 测试 测试结果 观察者模式中的角色 被观察者(observable)观察者(observer) 通过一个简单案例来演示观察者模式 被观察者接口 /*…