006贪心——算法备赛
跨步问题
跳跃游戏||
问题描述
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:
0 <= j <= nums[i]i + j < n
返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。
原题链接
思路分析
设nums[0]=x从起点0处出发走1步能到达[0,x]内的所有点,不必纠结具体要到那个点,反正到不了x+1及以后的点,遍历[0,x]区间内的每个点i,用nums[i]+i来更新走第2步能到达的最远点next,等遍历到x点,第二步所能到达的点的范围就是[x+1,next],以此类推,直到遍历到终点。
具体实现上,定义cur表示走ans步所能到达的最远点,next表示下一阶段所能到达的最远点,从左到右依次遍历,等遍历到cur时,表示到达ans步所能到达的最远点,若还没到达终点,则ans++,cur更新为next,最后的ans就是答案。
以{2,4,3,12,0,5,1}为例:

代码
int jump(vector<int>& nums) {int n = nums.size(), ans = 0, cur = 0, next = 0; //cur为走ans步能到达的最远处.for (int i = 0; i < n - 1; i++) { //注意i截止到n-2.next = max(next, i + nums[i]); //next为走ans+1步能到达的最远处.if (i == cur) cur = next, ans++; //到达ans步所能到达的最远处cur,后面还有节点,ans需要再+1,cur更新为next}return ans;}
总结:不用关系每一步走到哪的细节,到达ans所能到达的最远点后,贪心地选取下一阶段能到达的最远点next为阶段终点,步步为营。
达到数组末尾的最大得分
问题描述
给你一个长度为 n 的整数数组 nums 。
你的目标是从下标 0 出发,到达下标 n - 1 处。每次你只能移动到 更大 的下标处。
从下标 i 跳到下标 j 的得分为 (j - i) * nums[i] 。
请你返回你到达最后一个下标处能得到的 最大总得分 。
原题链接
思路分析
首先来分析一个子问题,1.从0下标处直接跳到n-1下标处,2.从0跳到中间某个下标i处再跳到n-1下标处,方案2的总得分比方案1大吗?
-
nums[i]>nums[0] 则
nums[0] * i + nums[i] * (n-1-i) > nums[0] * i+nums[0] (n-1-i)即
nums[0] * i + nums[i] * (n-1-i) > nums[0] * (n-1)方案2总得分大 -
nums[i]<=nums[0] 则
nums[0] * i + nums[i] * (n-1-i) <= nums[0] * i+nums[0] (n-1-i)即
nums[0] * i + nums[i] * (n-1-i) >= nums[0] * (n-1)方案2总得分没有更大
综上说明当中间有某个下标对应数组值大于nums[0]时,方案2的总得分才更大。
这也说明最佳方案是否要中转到i处,判断nums[i]是否大于上一阶段起点对应的nums值。
定义tar,初始时为nums[0]*(n-1),表示从0下标直接跳到n-1下标处的总得分
运用贪心思想,从下标1开始从左往右遍历,每次遍历到nums[i],判断nums[i]是否大于上一阶段的起点数组值,是说明中转到 i 处的方案获得的总得分比直接到终点获得的总得分要大;
此时便更新 上一阶段获得最大得分值,目标历史最大值,上一阶段起点数组值,上一阶段起点下标值
直到遍历完n-2,此时的目标历史最大值即为目标最大分数
代码
long long findMaximumScore(vector<int>& nums) {long long n=nums.size();long long tar=(long long)nums[0]*(n-1);long long maxn=nums[0]; //上一阶段起点数组值long long mt=0; //上一阶段起点下标值long long tr=0; //上一阶段获得最大得分值for(int i=1;i<n-1;i++){if(nums[i]>maxn){tr+=(i-mt)*maxn;tar=tr+nums[i]*(n-i-1);maxn=nums[i];mt=i;}}return tar;}
区间交集问题
用最少数量的箭引爆气球
问题描述
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 start,end, 且满足 start ≤ x ≤ end,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 。
原题链接
思路分析
首先对数组升序排序,定义一个变量pos,表示当前箭射在的位置,第一箭射在第一个气球的右边界,定义一个变量ans表示最少箭数,数组不为空时初始为1;
往右遍历每个气球,每当有新的气球的左边界小于等于pos,说明该气球可和前面气球有重叠部分可以一箭射穿,否则说明没有重叠部分,重置pos为其右边界,箭数+1;
代码
int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>& v) {return u[1] < v[1]; //以右边界为标准升序排序});int pos = points[0][1];int ans = 1;for (auto balloon: points) {if (balloon[0] > pos) {pos = balloon[1];++ans;}}return ans;}
无重叠区间
问题描述
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。
注意 只在一点上接触的区间是 不重叠的。例如 [1, 2] 和 [2, 3] 是不重叠的。
思路分析
求移除区间的最少数目,相当于求保留区间的最多数目,参照上一题用最少数量的箭引爆气球,k个两两相交的区间只能保留一个,为使后续保留的互不重叠的区间最多,应保留右边界最小的那个,将数组按右区间大小升序排序,定义一个变量right,代表当前两两相交区间集合的右边界,从左往右遍历每个区间,每当有区间左边界小于right,则该区间可以舍弃,否则更新右边界为当前区间的右边界,并将保留区间统计量m+1。最后intervals.size() - m就是答案。
将区间数组按右区间大小升序排序,再从左往右遍历,保证了枚举的区间右边界逐渐增大,使每个独立的两两相交区间集合的右边界尽量小,让后面能容纳更多的独立区间,最后统计的m就是保留区间数量的最大值。
代码
int eraseOverlapIntervals(vector<vector<int>>& intervals) {sort(intervals.begin(), intervals.end(), [](vector<int>& a, vector<int>& b) {return a[1] < b[1];});int m = 1;int right = intervals[0][1];for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= right) {m++;right = intervals[i][1];}}return intervals.size() - m;}
构造连续值问题
构造的连续值的最大数目
问题描述
给你一个长度为 n 的整数数组 coins ,它代表你拥有的 n 个硬币。第 i 个硬币的值为 coins[i] 。如果你从这些硬币中选出一部分硬币,它们的和为 x ,那么称,你可以 构造 出 x 。
请返回,你最多能 构造 出多少个从 0 开始(包括 0 )的连续整数。
你可能有多个相同值的硬币。
思路分析

设我们现在能构造出[0,x]区间的整数,现在我们新增一个整数 y,那么我们可以构造出的区间为[0,x]和 [y,x+y],那么如果 y≤x+1,则加入整数 y 后我们能构造出 [0,x+y] 区间的整数,否则我们还是只能构造出连续的 [0,x] 区间的数字。
具体实现上,我们每次从数组中找到未选择数字中的最小值来作为 y,因为如果此时的最小值 y 都不能更新区间 [0,x],那么剩下的其他更大元素肯定不能更新区间 [0,x]。那么我们初始从 x=0 开始,按照升序来遍历数组 nums 的元素来作为 y,如果 y≤x+1 那么我们扩充区间为 [0,x+y],否则我们无论选任何未选的数字都不能使答案区间变大,此时直接退出即可。
代码
int getMaximumConsecutive(vector<int>& coins) {int res = 1;sort(coins.begin(), coins.end());for (auto& i : coins) {if (i > res) {break;}res += i;}return res;}
作者:灵茶山艾府
最少砝码
问题描述
你有架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于N的正整数重量。
那么这套砝码最少需要多少个砝码?
注意天平的两边都可以放砝码。
思路分析
本题与上一题相似,略有不同之处在于,本题用数字构造连续区间可以用减法(放在天平另一侧)。思路大体相同。
设我们现在能构造出[1,x]区间的所有整数,现在新增一个y,那能构造出的区间为[1,x],[y-x,y],[y,x+y]。
如果y-x<=x+1即y<=2x+1则加入整数 y 后我们能构造出 [1,x+y] 区间的所有整数,最优方案的y是2x+1。
- 1个砝码时,使用最优方案,用重量为1的砝码,能称出的最大的从1开始连续的最大重量是
sum(1)=1 - 2个砝码时,使用最优方案,添加一个重量为
sum(1)*2+1=3的砝码,能称出最大的从1开始连续的最大重量是sum(2)=sum(1)+3 - 依次类推,n个砝码,能称出符合要求的最大上界是
sum(n-1)*2+1+sum(n-1)即3*sum(n-1)+1。
具体实现上,sum记录所能称出符合要求的最大上界,cnt记录砝码个数。每次添加一个砝码,并更新sum值,当sum>=n时的cnt就是答案。
#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;int sum = 1, cnt = 1; //sum存储可以表示区间的最大值while(sum<n){sum+=sum*2+1; //也可写成sum=3*sum+1cnt++;}cout << cnt ;return 0;
}
相关文章:
006贪心——算法备赛
跨步问题 跳跃游戏|| 问题描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j &…...
对 Python Websockets 库全方位详解
一、WebSocket 简介 WebSocket 是一种基于 TCP 的协议,支持全双工通信(服务器和客户端可以同时发送消息),适用于实时性要求高的场景(如聊天、实时数据监控、在线游戏等)。与 HTTP 不同,WebSock…...
pytorch中Dropout
Dropout 是一种常用的正则化技术,用于防止神经网络过拟合。PyTorch 提供了 nn.Dropout 层来实现这一功能。 基本用法 torch.nn.Dropout(p0.5, inplaceFalse) 参数说明: p (float): 每个元素被置为0的概率(默认0.5) inplace (b…...
【玩泰山派】2、制作buildroot镜像,并烧录
文章目录 前言制作buildroot镜像过程搭建环境(docker版)下载泰山派开发的sdk利用制作的镜像和下载的sdk去启动开发docker容器编译buildroot镜像 参考 前言 泰山派官方提供了不少现成的镜像 但是都买了泰山派了,肯定是想自己编译折腾下&…...
初阶数据结构--树
1. 树的概念与结构 树是⼀种⾮线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做 树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下的。 有⼀个特殊的结点,称…...
client-go如何监听自定义资源
如何使用 client-go 监听自定义资源 在 Kubernetes 中使用 client-go 监听自定义资源(Custom Resource,简称 CR)需要借助 Dynamic Client 或 Custom Informer,因为 client-go 的标准 Clientset 只支持内置资源(如 Pod…...
安装gpu版本的dgl
1.先去网址,找到对应版本的dgl,然后下载到本地。 dgl-whl下载地址 我的是python 3.8 ,cuda 11.6. windows 2.在虚拟环境里 输入 pip install E:\dgl-1.0.2cu116-cp38-cp38-win_amd64.whl (因为我下载到E盘里了) 这样GPU版本的d…...
AI比人脑更强,因为被植入思维模型【43】蝴蝶效应思维模型
giszz的理解:蝴蝶效应我们都熟知,就是说一个微小的变化,能带动整个系统甚至系统的空间和时间的远端,产生巨大的链式反应。我学习后的启迪,简单的说,就是不要忽视任何微小的问题,更多时候&#x…...
Libevent UDP开发指南
UDP 与 TCP 的核心区别 无连接:不需要建立/维护连接 不可靠:不保证数据包顺序和到达 高效:头部开销小,没有连接管理负担 支持广播/多播:可以向多个目标同时发送数据 一、基础UDP服务器实现 1. 创建 UDP 套接字 #include <event2/event.h> #include <event2/lis…...
Android View事件分发机制深度解析
在Android面试中,关于View事件分发机制的考察往往不仅限于基础流程,更关注底层原理、性能优化和实际应用场景。以下是针对面试的全面回答策略: 一、基础回答框架 核心三要素: 传递流程 "事件分发遵循Activity → Window →…...
如何在 GitHub 上开源一个小项目:从创建到长期维护的完整指南
如何在 GitHub 上开源一个小项目:从创建到长期维护的完整指南 适用于 个人开发者、团队合作、企业开源,涵盖 Git 基础、GitHub 配置、最佳实践、社区互动、自动化 CI/CD 及长期维护策略。 📌 1. 注册 GitHub 账户 如果你还没有 GitHub 账户&…...
autoconf 笔记250404
autoconf autoconf 是 Linux 系统中控制 IPv6 无状态地址自动配置(SLAAC) 的关键参数,位于 /proc/sys/net/ipv6/conf/<接口>/ 目录下。它决定接口是否根据接收到的 路由通告(Router Advertisement, RA) 自动生成…...
5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)
嗨,朋友们!👋 是不是感觉AI浪潮铺天盖地,身边的人都在谈论AI Agent、大模型,而你看着那些密密麻麻的代码,感觉像在读天书?🤯 别焦虑!你不是一个人。很多人都想抓住AI的风…...
FPGA——FPGA状态机实现流水灯
一、引言 在FPGA开发中,状态机是一种重要的设计工具,用于处理具有时间顺序的事件。本文将详细介绍如何使用状态机实现一个LED流水灯的效果。 二、状态机概述 状态机(FSM)是一种行为模型,用于表示系统在不同状态下的…...
晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包
晶晨S905-S905L-S905LB_S905M2通刷_安卓6.0.1_16S极速开机_线刷固件包 线刷方法:(新手参考借鉴一下) 刷机工具版本请用2.2.0以上,导入固件后,刷机工具右侧两个擦除打勾,然后点开始。插上刷机神器…...
构建第一个ArkTS应用:Hello World之旅
# 构建第一个ArkTS应用:Hello World之旅 在鸿蒙应用开发的领域中,ArkTS语言为我们提供了强大而便捷的开发方式。今天,就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先,我们要使用…...
第十五届单片机模拟考试III
题目 题目不长 ,功能也不难,一道水题 按键功能 S4界面切换,S5 功能切换,在不同界面转换不同的功能,定义两个标志位记录即可。 S9复位,回到初始状态,记得界面也得回到初始的信号界面࿰…...
测试:正交法设计测试用例
目录 一、什么是正交法 二、利用正交表设计测试用例 正交法设计测试用例的步骤 一、什么是正交法 正交法的目的是为了减少测试用例的数量,让尽可能少的用例覆盖两两组合。认识正交表。 最简单的正交表是L4(2^3),含意如下: “L”代表正…...
生成 SSH Key 并配置 GitHub/GitLab 详细教程
🔑 生成 SSH Key 并配置 GitHub/GitLab 详细教程 🟢 第 1 步:检查是否已有 SSH Key 在 Git Bash (Windows)、终端 (Linux/macOS) 运行以下命令: ls -al ~/.ssh🔹 可能的输出: 如果已有 SSH Key…...
[ctfshow web入门] web5
前置知识 引用博客:phps的利用 当服务器配置了 .phps 文件类型时,访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码,而不是执行它。.phps被作为辅助开发者的一种功能,开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …...
Qt基本框架(2)
本篇主要介绍如何设置窗口,以及在窗口中添加按钮 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt简单框架 2. 通过QMainWindow实现简单界面 QMainWindow是构建主窗口应用的核心类,通过合理设计…...
基于javaweb的SpringBoot图片管理系统图片相册系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
用HTML.CSS.JavaScript实现一个贪吃蛇小游戏
目录 一、引言二、实现思路1. HTML 结构2. CSS 样式3. JavaScript 逻辑 三、代码实现四、效果展示 一、引言 贪吃蛇是一款经典的小游戏,曾经风靡一时。今天,我们将使用 HTML、CSS 和 JavaScript 来实现一个简单的贪吃蛇小游戏。通过这个项目,…...
[特殊字符] Pandas 常用操作对比:Python 运算符 vs Pandas 函数
在 Pandas 中,许多操作可以直接使用 Python 的比较运算符(如 、!、>、< 等),而不需要调用 Pandas 的专门函数(如 eq()、ne()、gt() 等)。这些运算符在 Pandas 中已经被重载,代码更简洁。以…...
Java 实现插入排序:[通俗易懂的排序算法系列之三]
引言 大家好!欢迎继续关注我的排序算法系列。今天,我们要学习的是另一种非常基础且重要的排序算法——插入排序 (Insertion Sort)。 插入排序的思路非常贴近我们日常整理扑克牌的方式,理解起来相对自然。虽然它在最坏情况下的效率不高,但在某些特定场景下,它的表现甚至优…...
使用MATIO库写入MATLAB结构体(struct)数据的示例程序
使用MATIO库写入MATLAB结构体(struct)数据的示例程序 MATIO是一个用于读写MATLAB数据文件(.mat)的开源C库。下面是一个完整的示例程序,展示如何使用MATIO库创建一个包含结构体数据的MAT文件。 示例程序 #include <stdio.h> #include <stdlib.h> #inc…...
JVM——模型分析、回收机制
方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实例,几乎所有的对象实例都在这里分配内存 虚拟机栈:虚拟机栈描述的是|ava方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局…...
7. 记忆(Memory)机制:让AI拥有“短期记忆”与“长期记忆”
引言:当AI学会"记住你" 2025年某银行智能客服因无法记住用户身份,每次对话都要求重复验证,引发大量投诉。引入LangChain 记忆系统后,客户满意度提升62%。本文将基于MemorySaver与FAISS本地存储,教你构建符合…...
前后端分离下,Spring Boot 请求从发起到响应的完整执行流程
以下是前后端分离架构下,Spring Boot 请求从发起到响应的完整执行流程,结合你提出的所有问题,按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例: 一、前端发起请求(步骤1-2&…...
【文献阅读】Vision-Language Models for Vision Tasks: A Survey
发表于2024年2月 TPAMI 摘要 大多数视觉识别研究在深度神经网络(DNN)训练中严重依赖标注数据,并且通常为每个单一视觉识别任务训练一个DNN,这导致了一种费力且耗时的视觉识别范式。为应对这两个挑战,视觉语言模型&am…...
