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.pswp.cn/diannao/76586.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76586.shtml
英文地址,請注明出處:http://en.pswp.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標注…