LeetCode算法题(Go语言实现)_28

题目

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)
Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的 一 项:
禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失 所有的权利 。
宣布胜利:如果参议员发现有权利投票的参议员都是 同一个阵营的 ,他可以宣布胜利并决定在游戏中的有关变化。
给你一个字符串 senate 代表每个参议员的阵营。字母 ‘R’ 和 'D’分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。
以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。
假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 “Radiant” 或 “Dire” 。

一、代码实现

func predictPartyVictory(senate string) string {radiant := make([]int, 0)dire := make([]int, 0)n := len(senate)// 初始化队列,记录每个议员的位置for i, ch := range senate {if ch == 'R' {radiant = append(radiant, i)} else {dire = append(dire, i)}}// 模拟投票过程for len(radiant) > 0 && len(dire) > 0 {r := radiant[0]d := dire[0]radiant = radiant[1:]dire = dire[1:]// 位置靠前的议员禁止对方,并进入下一轮if r < d {radiant = append(radiant, r + n)} else {dire = append(dire, d + n)}}if len(radiant) > 0 {return "Radiant"}return "Dire"
}

二、算法分析

1. 核心思路
  • 贪心策略:每个议员优先禁止下一个最近的敌方议员,以最大化己方优势
  • 循环队列模拟:用两个队列分别存储双方议员的位置,通过位置比较实现投票轮次模拟
2. 关键步骤
  1. 初始化队列:遍历字符串,将R/D的位置分别存入两个队列
  2. 循环比较:每次取队列头部元素比较位置,较小者(先投票)禁止对方议员
  3. 下一轮入队:胜者将自己的位置加n(总人数)后重新入队,模拟循环投票
  4. 终止条件:当某一队列为空时,另一方获胜
3. 复杂度
指标说明
时间复杂度O(n)每个元素最多入队、出队各一次
空间复杂度O(n)存储所有参议员位置

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 全R/D字符串:直接返回对应阵营
  • 交替序列:如"RDRDRD" → 最终由最后一个议员决定胜负
  • 单议员场景:输入长度1时直接返回对应阵营
2. 多语言实现
# Python实现(deque优化)
from collections import dequedef predictPartyVictory(senate: str) -> str:radiant = deque()dire = deque()n = len(senate)for i, ch in enumerate(senate):if ch == 'R':radiant.append(i)else:dire.append(i)while radiant and dire:r = radiant.popleft()d = dire.popleft()if r < d:radiant.append(r + n)else:dire.append(d + n)return "Radiant" if radiant else "Dire"
// Java实现(LinkedList)
public String predictPartyVictory(String senate) {Queue<Integer> radiant = new LinkedList<>();Queue<Integer> dire = new LinkedList<>();int n = senate.length();for (int i = 0; i < n; i++) {if (senate.charAt(i) == 'R') radiant.offer(i);else dire.offer(i);}while (!radiant.isEmpty() && !dire.isEmpty()) {int r = radiant.poll(), d = dire.poll();if (r < d) radiant.offer(r + n);else dire.offer(d + n);}return radiant.isEmpty() ? "Dire" : "Radiant";
}

五、总结与扩展

1. 核心创新点
  • 循环索引设计:通过 +n 实现议员位置的循环复用,避免重新生成队列
  • 贪心策略证明:优先禁止最近敌方议员可最小化己方损失(数学归纳法可证)
2. 扩展应用
  • 多阵营选举:扩展为多个队列处理,比较优先级
  • 动态投票权:引入权重因子(如议员等级)
  • 实时统计系统:统计时间窗口内的请求频率(类似LeetCode 933)
3. 工程优化方向
  • 内存预分配:根据输入长度初始化队列容量
  • 并行处理:多线程处理大规模参议员场景

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

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

相关文章

使用python实现视频播放器(支持拖动播放位置跳转)

使用python实现视频播放器&#xff08;支持拖动播放位置跳转&#xff09; Python实现视频播放器&#xff0c;在我早期的博文中介绍或作为资料记录过 Python实现视频播放器 https://blog.csdn.net/cnds123/article/details/145926189 Python实现本地视频/音频播放器https://bl…

用Python和Pygame创造粉色粒子爱心:3D渲染的艺术

引言 在计算机图形学中&#xff0c;3D效果的2D渲染是一个迷人的领域。今天&#xff0c;我将分享一个使用Python和Pygame库创建的粉色粒子爱心效果。这个项目不仅视觉效果惊艳&#xff0c;而且代码简洁易懂&#xff0c;非常适合图形编程初学者学习3D渲染的基础概念。 项目概述…

在汇编层面理解MESI

理解MESI协议在汇编层面的表现需要结合缓存一致性机制和处理器指令执行的行为。以下是分步骤的解释&#xff1a; 1. MESI协议基础 MESI是缓存行&#xff08;Cache Line&#xff09;状态的协议&#xff0c;定义四种状态&#xff1a; Modified&#xff08;修改&#xff09;&…

爱瑞编程2025暑期CSP集训营开始招生啦!

一、什么是暑期CSP集训营&#xff1f; 为全力备战2025年9月CSP-J/S认证&#xff0c;举办的线下编程集训活动。 旨在通过高强度编程训练&#xff0c;帮助学员提升竞赛能力&#xff0c;冲刺一等奖。 二、为什么参加集训营&#xff1f; 高效编程特训&#xff1a;封闭式学习&…

问题大集10-git使用commit提交中文显示乱码

&#xff08;1&#xff09;问题 &#xff08;2&#xff09;解决步骤 1&#xff09; 设置全局编码为 UTF-8 git config --global core.quotepath false git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8 2&#xff09; 显示或设…

当AI开始“思考“:大语言模型的文字认知三部曲

引言&#xff1a;从《黑客帝国》说起 1999年上映的科幻经典《黑客帝国》描绘了一个令人震撼的未来图景——人类生活在一个由人工智能构造的数字矩阵中。当我们观察现代大型语言模型的工作原理时&#xff0c;竟发现与这个虚构世界有着惊人的相似&#xff1a;人们正在用矩阵以及矩…

Golang改进后的任务调度系统分析

以下是整合了所有改进点的完整代码实现: package mainimport ("bytes""context""fmt""io""log""net/http""sync""time""github.com/go-redis/redis/v8""github.com/robfig/…

前沿技术有哪些改变生活新趋势

太阳能技术正在改变的生活 它让移动设备有了新的能源选择 太阳能板能直接把阳光转成电能 这对户外活动或者电力不便的地方特别有用 比如现在市面上有不少太阳能充电宝 小巧便携 可以随时给手机平板充电 需要注意的是 这些设备得放在太阳下才能工作 但它们确实能让人在野外多用…

基于飞桨框架3.0本地DeepSeek-R1蒸馏版部署实战

深度学习框架与大模型技术的融合正推动人工智能应用的新一轮变革。百度飞桨&#xff08;PaddlePaddle&#xff09;作为国内首个自主研发、开源开放的深度学习平台&#xff0c;近期推出的3.0版本针对大模型时代的开发痛点进行了系统性革新。其核心创新包括“动静统一自动并行”&…

C++设计模式-模板方法模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析

一、基本介绍 模板方法模式&#xff08;Template Method Pattern&#xff09;是行为型设计模式&#xff0c;其核心思想是定义算法骨架&#xff0c;将具体步骤延迟到子类实现。如同烹饪菜谱的标准化流程&#xff1a;所有厨师遵循相同的操作流程&#xff08;备料→烹饪→装盘&am…

Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)

一、Logback 在 Spring Boot 中&#xff0c;日志框架默认使用的是 Logback&#xff0c;Spring Boot 提供了对日志配置的简化 Spring Boot 默认会将日志输出到控制台&#xff0c;并且日志级别为 INFO 可以在 application.yaml 或 application.properties 文件中进行日志配置 …

Python 异步编程:如何将同步文件操作函数无缝转换为异步版本

在 Python 的异步编程世界中,os.path 模块的同步文件操作函数常常让我们陷入两难境地:直接使用它们会阻塞事件循环,降低程序性能;但这些函数又如此方便实用。今天,我将带你探索如何巧妙地将这些同步函数转换为异步版本,让你的异步程序既能享受高效的事件处理,又能无缝利…

CUDA概览

一、CUDA 是什么&#xff1f; CUDA&#xff08;Compute Unified Device Architecture&#xff0c;计算统一设备架构&#xff09;是 NVIDIA 于2006年推出的并行计算平台与编程模型&#xff0c;旨在通过 GPU 的大规模并行计算能力加速科学计算、数据处理、人工智能等领域的计算任…

CSS3学习教程,从入门到精通, 学院网站完整项目 - HTML5 + CSS3 实现(25)

学院网站完整项目 - HTML5 CSS3 实现 下面是一个完整的学院网站项目&#xff0c;包含主页、新闻列表页、新闻详情页和视频宣传页的实现。我将按照您的要求提供详细的代码和注释。 项目结构 college-website/ ├── index.html # 主页 ├── news-list.html …

Ubuntu离线安装mysql

在 Ubuntu 24.04 上离线安装 MySQL 的步骤如下&#xff08;支持 MySQL 8.0 或 8.4&#xff09;&#xff1a; 一.安装方法 此次安装是按照方法一安装&#xff0c;其它方法供参考&#xff1a; 安装成功截图&#xff1a; 安全配置截图&#xff1a; sudo mysql_secure_installat…

SQL Server 2022 读写分离问题整合

跟着热点整理一下遇到过的SQL Server的问题&#xff0c;这篇来聊聊读写分离遇到的和听说过的问题。 一、读写分离实现方法 1. 原生高可用方案 1.1 Always On 可用性组&#xff08;推荐方案&#xff09; 配置步骤&#xff1a; -- 1. 启用Always On功能 USE [master] GO ALT…

【前端扫盲】postman介绍及使用

Postman 是一款专为 API 开发与测试设计的 全流程协作工具&#xff0c;程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明&#xff1a; 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法&#xff08;GET/POS…

IdeaVim-AceJump

‌AceJump 是一款专为IntelliJ IDEA平台打造的开源插件&#xff0c;旨在通过简单的快捷键操作帮助用户快速跳转到编辑器中的任何符号位置&#xff0c;如变量名、方法调用或特定的字符串‌。无论是大型项目还是日常编程&#xff0c;AceJump 都能显著提升你的代码导航速度和效率。…

[C语言入门] 结构体

目录 1. 啥是结构体 2. 啥是结构体变量 3. 创建结构体变量的小细节 3.1 创建全局结构体变量&#xff08;不推荐&#xff09; 3.2 创建局部结构体变量&#xff08;不推荐&#xff09; 3.3 创建局部结构体变量Plus 4. 结构体在内存里面咋存&#xff1f; 5. 结构体作为参数…

贤小二c#版Yolov5 yolov8 yolov10 yolov11自动标注工具 + 免python环境 GPU一键训练包

贤小二c#版yolo标注训练工具集 欢迎使用贤小二AI标注训练系统v2.0 本课程所有演示程序全部免费 1、这节课程主要演示贤小二AI标注训练系统的使用&#xff0c;以及标注数据时注意事项和技巧&#xff1b; 2、本程序采用c# Net8.0框架开发&#xff0c;是贤小二开发的一款Yolo标注…