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

LeetCode 0486.预测赢家:深度优先搜索(DFS)

【LetMeFly】486.预测赢家:深度优先搜索(DFS)

力扣题目链接:https://leetcode.cn/problems/predict-the-winner/

给你一个整数数组nums。玩家 1 和玩家 2 基于这个数组设计了一个游戏。

玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是0。每一回合,玩家从数组的任意一端取一个数字(即,nums[0]nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减1)。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。

如果玩家 1 能成为赢家,返回true。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回true。你可以假设每个玩家的玩法都会使他的分数最大化。

示例 1:

输入:nums = [1,5,2]输出:false解释:一开始,玩家 1 可以从 1 和 2 中进行选择。 如果他选择 2(或者 1 ),那么玩家 2 可以从 1(或者 2 )和 5 中进行选择。如果玩家 2 选择了 5 ,那么玩家 1 则只剩下 1(或者 2 )可选。 所以,玩家 1 的最终分数为 1 + 2 = 3,而玩家 2 为 5 。 因此,玩家 1 永远不会成为赢家,返回 false 。

示例 2:

输入:nums = [1,5,233,7]输出:true解释:玩家 1 一开始选择 1 。然后玩家 2 必须从 5 和 7 中进行选择。无论玩家 2 选择了哪个,玩家 1 都可以选择 233 。 最终,玩家 1(234 分)比玩家 2(12 分)获得更多的分数,所以返回 true,表示玩家 1 可以成为赢家。

提示:

  • 1 <= nums.length <= 20
  • 0 <= nums[i] <= 107

解题方法:深度优先搜索

写一个函数play,计算当前可选范围是nums[l]nums[r]时的最大得分。

  • 计算规则:选l和选r得分中最大的一个
  • 终止条件:nums中仅剩下一个元素

返回初始状态下play结果是否≥ 0 \geq 00

  • 时间复杂度O ( l e n ( n u m s ) 2 ) O(len(nums)^2)O(len(nums)2),可以看参数l llr rr最多有n 2 n^2n2种组合。
  • 空间复杂度O ( l e n ( n u m s ) ) O(len(nums))O(len(nums))

AC代码

C++
/* * @LastEditTime: 2026-08-01 19:00:00 */classSolution{private:intplay(vector<int>&nums,intl,intr){if(l==r){returnnums[l];}returnmax(nums[l]-play(nums,l+1,r),nums[r]-play(nums,l,r-1));}public:boolpredictTheWinner(vector<int>&nums){returnplay(nums,0,nums.size()-1)>=0;}};
C++ —— 别看,双端队列版本
/* * @LastEditTime: 2026-08-01 18:54:52 */classSolution{private:intplay(deque<int>&q){if(q.empty()){return0;}intfirst=q.front();q.pop_front();intscore1=first-play(q);q.push_front(first);intlast=q.back();q.pop_back();intscore2=last-play(q);q.push_back(last);returnmax(score1,score2);}public:boolpredictTheWinner(vector<int>&nums){deque<int>q;for(intt:nums){q.push_back(t);}returnplay(q)>=0;}};#ifdef_DEBUG/* [1,567,1,1,99,100] true */intmain(){string s;while(cin>>s){vector<int>v=stringToVector(s);Solution sol;cout<<sol.predictTheWinner(v)<<endl;}return0;}#endif

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.jsqmd.com/news/1311198/

相关文章:

  • 非标LCD屏驱动实战:从HDMI/Type-C接口到RK3588系统集成
  • 智选波段主 同花顺期货通指标
  • 2026年万能断路器回收厂家怎么选?重庆本地正规回收企业推荐指南 - 优质品牌商家
  • Hive数组高阶应用:从建模到性能优化的实战指南
  • 数学奇点全解析:从函数失效到系统平衡,理解技术中的临界点
  • 去AI痕迹怎么操作?2026年论文AI率从70%降到8%的实测记录
  • classpath到底是干嘛的
  • 期货分割趋势 同花顺期货通指标
  • 工业树莓派reComputer R20xx eMMC系统刷写全攻略:从原理到实践
  • 贾子理论新学术体系:可持续运营、反垄断与民间求真者组织的三大免疫机制
  • 数组传参、指针函数、函数指针
  • 大数据转大模型:算法是入场券,权限日志才是护城河
  • Node.js Excel读写全攻略:从SheetJS/xlsx入门到实战应用
  • 2026 年怀化可靠的市政管道公司有哪些,楼下那根看不见的管子,竟藏着关乎你家钱包的大秘密?-禹顺管道 - 实业推荐官【官方】
  • 华为MetaERP 在 Fusion 里“用 AutoAccounting 派生项目利润中心“这个说法需要稍微修正一下:Fusion PPM(项目组合管理)的会计分录不再走传统的 AutoAccoun
  • LSTM时间序列预测中滑动窗口的陷阱与最佳实践
  • 桓台宾馆(中心大街县政府店)的6个产品特色体验分享
  • 世界模型让生命科学即将进入“可计算演化”时代
  • Wand-Enhancer终极指南:3步免费解锁WeMod无限游戏时间与专业功能
  • ESP32S3文件系统实战:LittleFS与FATFS选型、集成与避坑指南
  • 【单片机毕设案例分享】基于 STM32 的 IC 卡车辆出入计时收费终端设计 嵌入式 RFID 刷卡智能停车闸道管控系统开发(016501)
  • Redis在CAP定理下的真实定位:从AP倾向到CP权衡的实战解析
  • 【翼型】基于matlab风洞压力数据自动处理计算气动系数(Cp、Cl、Cd、Cm)(生成与XFIL和薄翼型理论的对比可视化)【含Matlab源码 15912期】含报告
  • 开源小模型实战指南:从测评到私有化部署,低成本构建专属AI能力
  • 鲜活食材火锅店跑了5家,锅底和鲜菜口感差得挺多
  • 下载ie浏览器/彻底解决edge跳转ie浏览器问题
  • 2026 年 7 月新发布:永丰正规的吉安餐饮排烟管道定制厂家选哪家,开餐饮店怕排烟不畅?吉安这定制的管道居然能解决后厨大难题-腾米厨电 - 企业推荐管【认证】
  • WebPlotDigitizer:从图表图像中精准提取数据的坐标变换原理与实战
  • 降雨带波段点差 同花顺期货通指标
  • 怎样在3分钟内掌握ComfyUI图像风格迁移:终极IPAdapter Plus完全指南