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

每日一题 力扣 3418. 机器人可以获得的最大金币数 力扣 215. 数组中的第K个最大元素 动态规划 TopK问题 C++ 题解

文章目录力扣 3418. 机器人可以获得的最大金币数题目描述思路简介代码实现复杂度分析力扣 215. 数组中的第K个最大元素题目描述思路简介代码实现复杂度分析踩坑记录力扣 3418. 机器人可以获得的最大金币数题目描述力扣 3418. 机器人可以获得的最大金币数示例 1输入 coins [[0,1,-1],[1,-2,3],[2,-3,4]]输出 8解释一个获得最多金币的最优路径如下从 (0, 0) 出发初始金币为 0总金币 0。移动到 (0, 1)获得 1 枚金币总金币 0 1 1。移动到 (1, 1)遇到强盗抢走 2 枚金币。机器人在此处使用一次感化能力避免被抢总金币 1。移动到 (1, 2)获得 3 枚金币总金币 1 3 4。移动到 (2, 2)获得 4 枚金币总金币 4 4 8。示例 2输入 coins [[10,10,10],[10,10,10]]输出 40解释一个获得最多金币的最优路径如下从 (0, 0) 出发初始金币为 10总金币 10。移动到 (0, 1)获得 10 枚金币总金币 10 10 20。移动到 (0, 2)再获得 10 枚金币总金币 20 10 30。移动到 (1, 2)获得 10 枚金币总金币 30 10 40。提示m coins.lengthn coins[i].length1 m, n 500-1000 coins[i][j] 1000思路简介这道题是典型的带状态约束的网格动态规划问题。机器人只能向右或向下移动核心约束是最多可使用2次感化能力因此无法用常规的二维DP解决需要引入第三个维度记录感化能力的使用次数。我们设已知的金币数组大小m,n为了规避网格边界第一行、第一列的特殊初始化处理我们将DP数组的维度定义为(m1) x (n1) x 3其中dp[i][j][k]表示机器人从起点(0,0)走到网格单元格(i-1,j-1)时累计使用了k次感化能力能够获得的最大金币数k的取值为0、1、2对应0次、1次、2次感化。状态转移方程推导机器人到达(i-1,j-1)只有两种路径从上方(i-2,j-1)向下走或从左方(i-1,j-2)向右走。针对当前单元格是否使用感化能力分两种情况处理k0未使用过感化能力此时无法对当前单元格使用感化只能直接累加当前单元格的金币值。取上方和左方路径中的最大值加上当前单元格的金币即可dp[i][j][0] max(dp[i-1][j][0], dp[i][j-1][0]) coins[i-1][j-1]1≤k≤2已使用k次感化能力此时有两种选择取两者的最优解选择1当前单元格不使用感化逻辑和k0一致感化次数保持k不变累加当前单元格金币。选择2当前单元格使用感化coins[i][j] 0的单元格才有强盗也就是这种单元格刚才会进入当前情况即当前单元格中负数单元格不扣钱收益为 0所以我们直接去找上方和左方dp[i-1][j], dp[i][j-1]的k-1时当前为k那么使用本次感化前的使用次数为k-1的最大值即可。最终状态转移方程dp[i][j][k]max(max(dp[i-1][j][k],dp[i][j-1][k])coins[i-1][j-1],// 不使用感化max(dp[i-1][j][k-1],dp[i][j-1][k-1])// 使用感化当前单元格无金币损失)注当当前单元格为正数时「不使用感化」的收益一定更高因此选择2会自动被舍弃无需额外判断。初始化逻辑对dp数组的初始化用的是INT_MIN/2而不是INT_MIN是因为INT_MIN是 int 类型的最小值-2^31后续状态转移时如果加上负数会触发整型溢出导致未定义行为除以 2 可以留出足够的数值余量避免溢出。起点(0,0)对应DP数组的dp[1][1][k]分情况初始化dp[1][1][0]不使用感化直接获取起点的金币值即coins[0][0]。dp[1][1][1]、dp[1][1][2]使用感化能力哪怕起点是负数也能避免扣钱因此收益为max(coins[0][0], 0)。由于题目并没有说明所以起点的值不一定为固定值所以我们的初始化不能够合并成一个循环进行最终结果题目允许最多使用2次感化能力因此最终结果为dp[m][n][2]。dp[m][n][2](0,0)~(m-1,n-1)这个范围中用了2次感化技能之后取得的最大金币数量为什么直接返回dp[m][n][2]而不是max(dp[m][n][0], dp[m][n][1], dp[m][n][2])—— 因为感化次数越多可选的操作越多最优收益一定满足dp[m][n][2] dp[m][n][1] dp[m][n][0]代码实现#includevector#includeclimits// 用于INT_MINusingnamespacestd;classSolution{public:intmaximumAmount(vectorvectorintcoins){intmcoins.size();// 网格的行数intncoins[0].size();// 网格的列数// 定义三维DP数组维度为(m1) x (n1) x 3// 初始化为INT_MIN/2代表初始状态不可达// 除以2是为了避免后续状态转移时加上负数导致整型溢出vectorvectorvectorintdp(m1,vectorvectorint(n1,vectorint(3,INT_MIN/2)));// 初始化起点(0,0)对应的dp[1][1]dp[1][1][0]coins[0][0];// 不使用感化直接拿起点金币for(intk1;k2;k){// 使用1次或2次感化起点收益为max(金币值, 0)负数不扣钱dp[1][1][k]max(coins[0][0],0);}// 遍历网格所有单元格for(inti1;im;i){for(intj1;jn;j){if(i1j1)continue;// 起点已初始化跳过// 处理k0的情况从未使用过感化dp[i][j][0]max(dp[i-1][j][0],dp[i][j-1][0])coins[i-1][j-1];// 处理k1和k2的情况使用过1次或2次感化for(intk1;k2;k){// 两种选择取最大值不使用当前感化 / 对当前单元格使用感化dp[i][j][k]max(max(dp[i-1][j][k],dp[i][j-1][k])coins[i-1][j-1],max(dp[i-1][j][k-1],dp[i][j-1][k-1]));}}}// 返回最多使用2次感化的最大收益returndp[m][n][2];}};复杂度分析时间复杂度O(m*n)。m和n为网格的行列数感化次数k的最大值为2固定常数因此总循环次数为m*n*3时间复杂度为线性级别。空间复杂度O(m*n)。三维DP数组的总大小为(m1)*(n1)*3k为常数因此空间复杂度为O(m*n)。补充优化由于每个状态仅依赖上一行和当前行的左侧状态可将空间进一步优化为O(n)二维滚动数组。力扣 215. 数组中的第K个最大元素题目描述力扣 215. 数组中的第K个最大元素示例 1:输入: [3,2,1,5,6,4], k 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6], k 4输出: 4提示1 k nums.length 105-104 nums[i] 104思路简介本题是经典的TopK问题题目要求实现时间复杂度为O(n)的算法因此最优解为快速选择算法基于三指针快排的分治剪枝优化。核心思路快速选择算法的核心是「分治剪枝」基于三指针快排的逻辑随机选择一个基准值将数组划分为三个区间小于基准值、等于基准值、大于基准值。无需对整个数组排序只需根据三个区间的长度判断第K大的元素落在哪个区间仅对目标区间递归处理舍弃无关区间的计算从而将平均时间复杂度从快排的O(nlogn)优化到O(n)。我们要找的是「第K个最大元素」等价于数组升序排序后「第nums.size() - k 1个最小元素」。本文代码基于「找第K小元素」的逻辑实现因此在调用递归函数时会先对k值做上述转换。如果快排和解决Topk问题有遗忘的朋友可以看下我这两个博客其中讲解非常详细并由完整的手绘图片说明看不懂你打我快排优化C 分治 快速排序优化 三指针快排 力扣 912. 排序数组 题解 每日一题TopK的几种解决方法堆排快排C 分治 快速选择算法 堆排序 TopK问题 力扣 215. 数组中的第K个最大元素 题解 每日一题代码实现#includevector#includecstdlib#includectimeusingnamespacestd;classSolution{public:// 递归函数在nums的[begin, end]闭区间内找第k个最小的元素intTopK(vectorintnums,intbegin,intend,intk){// 递归终止条件区间只有一个元素该元素就是目标if(beginend)returnnums[begin];// 1. 随机选择基准值避免有序数组下的最坏时间复杂度intmarknums[(rand()%(end-begin1))begin];// 三指针定义intleftbegin-1;// 左区间mark的右边界intrightend1;// 右区间mark的左边界intibegin;// 遍历指针// 2. 三指针分区将数组划分为 mark、mark、mark 三个区间while(iright){if(nums[i]mark){// 元素归入左区间左边界右移交换元素遍历指针后移left;swap(nums[left],nums[i]);i;}elseif(nums[i]mark){// 元素归入中间区间直接后移遍历指针i;}else{// 元素归入右区间右边界左移交换元素遍历指针不动交换来的元素未处理right--;swap(nums[right],nums[i]);}}// 3. 计算三个区间的长度判断目标元素所在区间intlessLenleft-begin1;// 左区间长度小于基准值的元素个数intequalLenright-left-1;// 中间区间长度等于基准值的元素个数if(klessLen){// 目标在左区间递归处理左区间returnTopK(nums,begin,left,k);}elseif(klessLenequalLen){// 目标在中间区间基准值就是目标元素returnmark;// 原代码返回nums[left1]等价于mark此处更直观}else{// 目标在右区间调整k值后递归处理右区间returnTopK(nums,right,end,k-lessLen-equalLen);}}intfindKthLargest(vectorintnums,intk){// 初始化随机数种子确保每次运行基准值随机srand(time(nullptr));// 第k大元素 升序数组中第 (nums.size() - k 1) 小的元素returnTopK(nums,0,nums.size()-1,nums.size()-k1);}};复杂度分析时间复杂度平均O(n)最坏O(n²)。快速选择每次仅递归处理一个子区间平均情况下子区间长度每次减半总操作次数为n n/2 n/4 ... 1 ≈ 2n因此平均时间复杂度为O(n)最坏情况为每次分区仅排除一个元素时间复杂度退化为O(n²)但随机基准值可将最坏情况的出现概率降至极低。空间复杂度平均O(logn)最坏O(n)。空间消耗主要来自递归栈平均情况下递归深度为O(logn)最坏情况下为O(n)。踩坑记录三维DP数组的初始化与溢出问题3418题中DP数组初始值必须设为INT_MIN/2而非INT_MIN。因为路径的金币可能为负数若直接用INT_MIN后续状态转移时加上负数会导致整型溢出触发未定义行为。同时开m1、n1的数组维度能有效规避第一行、第一列的边界判断减少初始化的复杂度。DP状态定义的一致性3418题的DP数组存在「数组下标与网格坐标的错位」写状态转移时必须严格保持dp[i][j]对应coins[i-1][j-1]否则会出现数组越界或逻辑错误。TopK问题的第k大/第k小转换215题中第k大和第k小的转换极易出错必须明确长度为n的数组中第k大元素 升序排序后第n-k1小的元素转换时k值计算错误会直接导致结果错误还有要注意在递归过程中K由于舍弃部分数组导致的变化。快速选择的随机基准值面试中实现快速选择时必须添加随机基准值的逻辑。若使用固定基准如区间第一个元素在有序数组的测试用例中会直接退化为O(n²)的时间复杂度不仅会超时也会影响面试官的评价。三指针分区的指针移动逻辑215题的三指针分区中元素归入右区间时遍历指针i不能后移——因为交换过来的元素还未经过判断需要重新处理否则会出现分区错误、元素遗漏的问题。如果有哪里没讲清楚、或者有更优的解法欢迎在评论区交流我会通知漂泊者第一时间回复大家如果这篇博客对你有帮助别忘了点赞支持一下也可以收藏起来方便后续刷题复习时随时翻看。要是能顺手点个关注爱弥斯还能得到漂泊者批准的游戏时间哦

相关文章:

每日一题 力扣 3418. 机器人可以获得的最大金币数 力扣 215. 数组中的第K个最大元素 动态规划 TopK问题 C++ 题解

文章目录力扣 3418. 机器人可以获得的最大金币数题目描述思路简介代码实现复杂度分析力扣 215. 数组中的第K个最大元素题目描述思路简介代码实现复杂度分析踩坑记录力扣 3418. 机器人可以获得的最大金币数 题目描述 力扣 3418. 机器人可以获得的最大金币数 示例 1&#xff1…...

市场推广需要哪些数据分析能力?渠道评估、归因和转化怎么分析

市场推广数据分析能力框架市场推广的核心在于数据驱动决策,掌握以下能力可显著提升推广效果。CDA数据分析师证书持证者通常在这些领域具备系统化知识。能力维度关键技能应用场景数据采集能力熟悉Google Analytics、Adobe Analytics等工具,掌握UTM参数设置…...

2025届最火的十大AI辅助论文平台横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AIGC检测服务是学术规范领域里较为重要的技术工具,它的核心功能是去识别学术…...

Vue生命周期的灵魂拷问:created vs mounted,数据请求到底该在哪?

Vue生命周期的灵魂拷问:created vs mounted,数据请求到底该在哪? 在Vue.js的世界里,生命周期钩子是赋予开发者“上帝视角”的魔法,让我们能在组件从诞生到消亡的整个过程中,在精确的时机注入自定义逻辑。其…...

2026届最火的AI辅助论文网站横评

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 要想把内容被认定成AIGC的可能性给降低,能够采用下面这些策略:第一&a…...

3分钟免费搞定Axure RP中文汉化:完整语言包安装指南

3分钟免费搞定Axure RP中文汉化:完整语言包安装指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的…...

如何使用Unlocker工具在VMware中启用macOS虚拟机支持

如何使用Unlocker工具在VMware中启用macOS虚拟机支持 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker Unlocker是一款开源工具,能够帮助用户在VMware虚拟机软件中解锁对macOS操作系统的支持。…...

Qwen3-32B部署全攻略:3步搞定,零基础也能快速上手

Qwen3-32B部署全攻略:3步搞定,零基础也能快速上手 1. 为什么选择Qwen3-32B? Qwen3-32B是当前开源大模型领域的佼佼者,拥有320亿参数的强大能力。与市面上其他模型相比,它有三个突出优势: 推理能力卓越&a…...

Local Moondream2快速部署:VS Code Dev Container一键开发环境

Local Moondream2快速部署:VS Code Dev Container一键开发环境 1. 项目简介 Local Moondream2是一个基于Moondream2构建的超轻量级视觉对话Web界面。它能够让你的电脑拥有"眼睛",可以对上传的图片进行详细描述、反推绘画提示词,或…...

终极指南:5步解锁MacBook Touch Bar在Windows系统的完整显示功能

终极指南:5步解锁MacBook Touch Bar在Windows系统的完整显示功能 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 还在为MacBook Pro的Touch Bar在Wind…...

2026 AI工具选型实录:六大场景下的模型对比与效率实测

AI正在成为新一代生产力工具2026年的AI工具市场,已经从"谁参数大"的竞争,转向了"谁真正能落地提效"的比拼。一个明显的信号:CSDN上关于AI编程工具选型的讨论热度,从去年的"要不要用"变成了"用…...

社交媒体 SEO 优化应该注意哪些

社交媒体 SEO 优化的核心要点 在当今数字化时代,社交媒体已经成为品牌营销和用户互动的重要平台。单靠社交媒体上的粉丝数量不能保证品牌的成功。为了在众多用户中脱颖而出,社交媒体 SEO 优化显得尤为重要。社交媒体 SEO 优化应该注意哪些关键点呢&…...

LAV Filters完整教程:如何让Windows播放器支持所有视频格式

LAV Filters完整教程:如何让Windows播放器支持所有视频格式 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters LAV Filters是一套基于ffmpeg的开源Di…...

Linux实时查看CUDA显卡使用情况的常用命令详解

在 Linux 系统中,你可以使用以下几个常用命令来实时查看 CUDA 显卡的情况:1. nvidia-smi 命令nvidia-smi(NVIDIA System Management Interface)是 NVIDIA 提供的一个命令行工具,它可以实时显示 NVIDIA GPU 的状态信息&…...

STM8 Bootloader设计与CAN总线固件升级实践

1. 项目概述在嵌入式产品开发中,经常会遇到设备出厂后需要远程升级固件的需求。特别是当设备已经封装完成,无法通过常规编程接口(如SWIM、JTAG)进行烧录时,Bootloader技术就成为了解决问题的关键方案。这次出差经历让我…...

2026年4月OpenClaw部署教程:阿里云快速部署OpenClaw、配置百炼APIKey、集成Skill详细方法

2026年4月OpenClaw部署教程:阿里云快速部署OpenClaw、配置百炼APIKey、集成Skill详细方法。OpenClaw(原Clawdbot)作为2026年主流的AI自动化助理平台,可通过阿里云轻量服务器实现724小时稳定运行,并快速接入钉钉&#x…...

OFA图像描述模型商业应用:自动生成产品图片描述,提升电商效率

OFA图像描述模型商业应用:自动生成产品图片描述,提升电商效率 1. 电商图片描述的痛点与解决方案 在电商运营中,产品图片描述是一个既重要又繁琐的工作。传统方式需要人工撰写每张产品图片的说明文字,这不仅效率低下,…...

小白友好!YOLO11镜像部署教程:无需独立显卡也能体验目标检测

小白友好!YOLO11镜像部署教程:无需独立显卡也能体验目标检测 1. 引言:为什么选择YOLO11镜像 目标检测是计算机视觉中最基础也最实用的技术之一,而YOLO系列算法以其快速高效著称。最新发布的YOLO11在保持实时性的同时&#xff0c…...

Qwen3.5-9B-AWQ-4bit Visual Studio开发者的AI伙伴:C#与.NET项目集成

Qwen3.5-9B-AWQ-4bit Visual Studio开发者的AI伙伴:C#与.NET项目集成 1. 当AI大模型遇上.NET开发 想象一下这样的场景:你在Visual Studio中编写一个ASP.NET Core控制器时,突然卡在某个LINQ查询的实现上。这时,你的IDE不仅能提示…...

OpenClaw+Phi-3-vision-128k-instruct对比测试:图文问答精度超越纯文本模型3倍

OpenClawPhi-3-vision-128k-instruct对比测试:图文问答精度超越纯文本模型3倍 1. 测试背景与动机 最近在探索多模态模型的实际应用价值时,我注意到微软发布的Phi-3-vision-128k-instruct模型在图文理解方面有突出表现。作为一个长期使用OpenClaw进行自…...

AI 模型训练中的梯度裁剪技巧

AI模型训练中的梯度裁剪技巧 在深度学习的模型训练过程中,梯度爆炸是一个常见的问题,它会导致模型参数更新过大,进而使训练过程变得不稳定甚至无法收敛。为了解决这一问题,梯度裁剪(Gradient Clipping)技术…...

帕拉丁调试指南之SDL 语言编写指南(快速参考)

1. SDL 文件基本结构SDL 程序由三个主要部分组成:text// 1. 全局定义段(可选) scope ...; define ...; enum ...; tdef ...; trigger ...; if (...) trigger; ...// 2. 实例定义段(至少一个实例,可多个) i…...

AgentCPM深度研报助手企业级部署架构设计:高并发下的性能与成本优化

AgentCPM深度研报助手企业级部署架构设计:高并发下的性能与成本优化 最近和几个做金融科技的朋友聊天,他们都在头疼一件事:公司内部的分析师、研究员越来越多地依赖AI来辅助撰写行业研报,但现有的AI服务要么太贵,要么…...

通用物体识别-ResNet18镜像5分钟快速部署:零基础搭建AI图像分类服务

通用物体识别-ResNet18镜像5分钟快速部署:零基础搭建AI图像分类服务 1. 引言:为什么选择ResNet-18进行物体识别? 在当今AI技术快速发展的时代,图像分类已经成为许多应用的基础功能。但对于初学者和中小型企业来说,部…...

餐饮店主的AI助手:像素特工Ostrakon-VL快速上手,自动检查厨房卫生与陈列

餐饮店主的AI助手:像素特工Ostrakon-VL快速上手,自动检查厨房卫生与陈列 1. 为什么餐饮店主需要AI视觉助手 想象一下这样的场景:早上开店前,你匆匆拍下厨房的照片,上传到一个系统。几秒钟后,它告诉你&…...

CLAP Zero-Shot Audio Classification Dashboard与卷积神经网络的性能对比

CLAP Zero-Shot Audio Classification Dashboard与卷积神经网络的性能对比 音频分类技术正在经历一场革命性的变革。传统的卷积神经网络(CNN)方法需要大量标注数据进行训练,而新兴的零样本学习技术正在改变这一格局。今天我们将深入对比CLAP…...

构建高效Cursor Pro功能解锁的模块化架构实现指南

构建高效Cursor Pro功能解锁的模块化架构实现指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial request limi…...

量化交易开发实战指南:从入门到部署

量化交易开发实战指南:从入门到部署 【免费下载链接】StockSharp Algorithmic trading and quantitative trading open source platform to develop trading robots (stock markets, forex, crypto, bitcoins, and options). 项目地址: https://gitcode.com/gh_mi…...

二次封装ElementUI日期范围组件:打造带限制规则的Vue2 v-model响应式通用组件

二次封装ElementUI日期范围组件:打造带限制规则的Vue2 v-model响应式通用组件 在基于Vue2ElementUI的后台系统开发中,日期范围选择器是高频使用的表单组件。原生组件虽满足基础选择需求,但面对日期范围限制(最长90天)、…...

Go Routine 调度模型详解

Go Routine 调度模型详解 在现代编程语言中,高效的并发模型是提升程序性能的关键。Go语言凭借其轻量级的Go Routine和高效的调度器,成为高并发场景下的佼佼者。本文将深入解析Go Routine的调度模型,帮助开发者理解其底层机制,从而…...