LeetCode百題刷002摩爾投票法

遇到的問題都有解決的方案,希望我的博客可以為你提供一些幫助

圖片源自leetcode?

題目:169. 多數元素 - 力扣(LeetCode)

一、排序法

題目要求需要找到多數值(元素個數>n/2)并返回這個值。一般會想到先排個序,再取中間值;因為在有序數組中多數值(元素個數>n/2)的中間值必定是多數值。

代碼如下:

class Solution:def majorityElement(self, nums: List[int]) -> int:nums.sort()return nums[len(nums)//2]
class Solution {
public:int majorityElement(vector<int>& nums) {sort(nums.begin(),nums.end());return nums[nums.size()/2];}
};

復雜度分析?

時間復雜度:O(nlogn)

使用的排序算法時間復雜度是O(nlogn)

空間復雜度:O(1)

?在原數組上排序,無額外空間開銷

結果

二、哈希表法

一個比較常規的思路是:對于每一個元素我可以記錄它出現的次數,最后返回出現次數最多的元素就行。這樣問題就變成了如何在無序的數組中精確的識別出每一個元素,并且記錄他們出現的次數。哈希表天然適配,哈希表提供key-value鍵值映射,key可用于記錄數組中的元素,value可用于累計出現的次數。

class Solution:def majorityElement(self, nums: List[int]) -> int:ans={}for num in nums:ans [num]=ans.get(num,0)+1return max(ans,key=ans.get)
class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int ,int> ans;int n=nums.size();for (auto num :nums){ans[num]++;if (ans[num]>n/2){return num;}}return -1;}
};

復雜度分析:

?時間復雜度:O(n)只需要遍歷一次數組

空間復雜度:O(n)最壞情況下需要與元素組等大的空間,但在本題目中明確指出了多數元素是存在的所以最多需要空間不大于 n/2

?三、摩爾投票法(Boyer-Moore Voting Algorithm)

1. 基本思想

摩爾投票法是一種用于?快速尋找數組中出現次數超過一定比例的元素?的算法。其核心思想是通過?“抵消”?策略,在遍歷數組時維護候選元素及其計數,最終找到可能的眾數。

  • 經典問題:在數組中找出出現次數超過?n/2?的元素(即嚴格眾數)。

  • 擴展問題:找出所有出現次數超過?n/k?的元素(如?k=3,找出出現次數超過?n/3?的元素)。

2. 算法步驟(以尋找嚴格眾數為例)
  1. 初始化
    設置候選元素?candidate?和計數器?count,初始值為?None?和?0

  2. 遍歷數組
    對每個元素?num

    • 如果?count == 0,設當前元素為候選(candidate = num)。

    • 如果?num == candidate,計數器加一(count += 1)。

    • 否則,計數器減一(count -= 1)。

  3. 驗證結果
    最終需再次遍歷數組,確認?candidate?的出現次數是否超過?n/2

3. 示例分析

以數組?nums = [3, 2, 3]?為例,尋找嚴格眾數(出現次數 > 3/2 = 1.5,即至少出現 2 次):

步驟當前元素candidatecount操作
1331count=0 → 選為候選
2230不同 → count減1
3331count=0 → 重新選為候選

最后驗證?3?出現 2 次,滿足條件。

4. 擴展:尋找出現次數超過?n/k?的元素

若需找出所有出現次數超過?n/k?的元素(例如?k=3),需維護?k-1?個候選元素及其計數器。

步驟

  1. 初始化
    維護?k-1?個候選和計數器,如?candidate1, count1?和?candidate2, count2(當?k=3?時)。

  2. 遍歷數組

    • 若當前元素與任一候選相同,對應計數器加一。

    • 若不同且某計數器為 0,替換候選并重置計數器為 1。

    • 否則,所有計數器減一。

  3. 驗證候選
    統計所有候選的實際出現次數,確認是否超過?n/k

5. 對于本題目而言如何應用

思路
多數元素出現次數大于數組長度一半,利用抵消思想,每次找到兩個不同元素就抵消掉,最后剩下的就是多數元素。遍歷數組,維護一個候選元素?candidate?和其出現次數?count?。遇到相同元素,count?加 1;遇到不同元素,count?減 1 ,若?count?為 0 ,更新?candidate?為當前元素并將?count?設為 1 。

class Solution:def majorityElement(self, nums: List[int]) -> int:candidate = Nonecount = 0for num in nums:if count == 0:candidate = numcount += 1 if num == candidate else -1# 驗證return candidate if nums.count(candidate) > len(nums) // 2 else -1
class Solution {
public:int majorityElement(vector<int>& nums) {int condidate =NULL;int count=0;for (auto num:nums){if (count==0){condidate=num;}count=count++?condidate==num:count--;}return condidate;}
};
尋找出現次數超過 n/3 的元素
def majorityElement_3(nums):candidate1, count1 = None, 0candidate2, count2 = None, 0for num in nums:if num == candidate1:count1 += 1elif num == candidate2:count2 += 1elif count1 == 0:candidate1, count1 = num, 1elif count2 == 0:candidate2, count2 = num, 1else:count1 -= 1count2 -= 1# 驗證候選res = []for c in [candidate1, candidate2]:if nums.count(c) > len(nums) // 3:res.append(c)return res

結果:

6. 復雜度分析
  • 時間復雜度:O(n)
    僅需兩次遍歷數組(第一次找候選,第二次驗證)。本題中只需遍歷一次,不需要驗證(題干條件已給出一定有多數元素)。

  • 空間復雜度:O(1)
    僅需常數空間存儲候選和計數器。


7. 與其他方法對比
方法優點缺點
摩爾投票法O(1) 空間需驗證結果
哈希統計直觀,可統計所有元素O(n) 空間,不適用于大數據流

摩爾投票法可以在線性時間和常數空間內高效解決多數元素問題,尤其適合處理大規模數據或內存受限的場景。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79469.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Studio Gradle 中 只顯示 Tasks 中沒有 build 選項解決辦法

一、問題描述 想把項目中某一個模塊的代碼單獨打包成 aar ,之前是點擊 AndroidStudio 右側的 Gradle 選項&#xff0c;然后再點擊需要打包的模塊找到 build 進行打包&#xff0c;但是卻發現沒有 build 選項。 二、解決辦法 1、設置中勾選 Configure all Gradle tasks… 選項 …

深入淺出之STL源碼分析2_stl與標準庫,編譯器的關系

引言 在第一篇博客中&#xff0c;深入淺出之STL源碼分析1_vector基本操作-CSDN博客 我們將引出下面的幾個問題 1.剛才我提到了我的編譯器版本是g 11.4.0&#xff0c;而我們要講解的是STL&#xff08;標準模板庫&#xff09;&#xff0c;那么二者之間的關系是什么&#xff1f;…

(十二)深入了解AVFoundation-采集:人臉識別與元數據處理

&#xff08;一&#xff09;深入了解AVFoundation&#xff1a;框架概述與核心模塊解析-CSDN博客 &#xff08;二&#xff09; 深入了解AVFoundation - 播放&#xff1a;AVFoundation 播放基礎入門-CSDN博客 &#xff08;三&#xff09;深入了解AVFoundation-播放&#xff1…

Kafka 與 RabbitMQ、RocketMQ 有何不同?

一、不同的誕生背景&#xff0c;塑造了不同的“性格” 名稱 背景與目標 產品定位 Kafka 為了解決 LinkedIn 的日志收集瓶頸&#xff0c;強調吞吐與持久化 更像一個“可持久化的分布式日志系統” RabbitMQ 出自金融通信協議 AMQP 的實現&#xff0c;強調協議標準與廣泛適…

配置 Web 服務器練習

一、要求 1.通過https://ip 可以訪問到網站首頁 2.通過 https://ip/private/ 實現用戶訪問控制&#xff0c;僅允許已經添加的 tom&#xff0c;jerry 能夠訪問到 private 子路徑的界面 3.通過 https://ip/vrit/ 實現能夠訪問到將系統 /nginx/virt 目錄下的網頁文件&#xff0…

MySQL索引詳解(下)(SQL性能分析,索引使用)

索引是MySQL性能優化的核心&#xff0c;但如何精準分析查詢瓶頸、合理設計索引&#xff0c;是開發者必須掌握的技能。本文結合實戰案例&#xff0c;系統講解SQL性能分析工具鏈與索引使用技巧&#xff0c;幫助讀者構建高性能數據庫系統。 一、SQL性能分析&#xff1a;從宏觀到微…

招行數字金融挑戰賽數據賽道賽題一

賽題描述&#xff1a;根據提供的用戶行為數據&#xff0c;選手需要分析用戶行為特征與廣告內容的匹配關系&#xff0c;準確預測用戶對測試集廣告的點擊情況&#xff0c;通過AUC計算得分。 得分0.6120&#xff0c;排名60。 嘗試了很多模型都沒有能夠提升效果&#xff0c;好奇大…

ORB-SLAM3和VINS-MONO的對比

直接給總結&#xff0c;整體上orbslam3&#xff08;僅考慮帶imu&#xff09;在初始化階段是松耦合&#xff0c;localmap和全局地圖優化是緊耦合。而vins mono則是全程緊耦合。然后兩者最大的區別就在于vins mono其實沒有對地圖點進行優化&#xff0c;為了輕量化&#xff0c;它一…

安裝typescript時,npm install -g typescript報錯

刪除C:\Users\用戶\下的.npmrc文件,如果你的沒有&#xff0c;看是不是因為將隱藏的項目勾選上了&#xff0c;然后去掉勾選。 重新輸入

[GESP202503 四級] 二階矩陣c++

題目描述 小 A 有一個 n 行 m 列的矩陣 A。 小 A 認為一個 22 的矩陣 D 是好的&#xff0c;當且僅當 。其中 表示矩陣 D 的第 i 行第 j 列的元素。 小 A 想知道 A 中有多少個好的子矩陣。 輸入 第一行&#xff0c;兩個正整數 n,m。 接下來 n 行&#xff0c;每行 m 個整數…

基于flask+pandas+csv的報表實現

基于大模型根據提示詞去寫SQL執行SQL返回結果輸出報表技術上可行的&#xff0c;但為啥還要基于pandas去實現呢&#xff1f; 原因有以下幾點&#xff1a; 1、大模型無法滿足實時性輸出報表的需求&#xff1b; 2、使用大模型比較適合數據量比較大的場景&#xff0c;大模型主要…

Java學習筆記(對象)

一、對象本質 狀態&#xff08;State&#xff09;&#xff1a;通過成員變量&#xff08;Field&#xff09;描述 行為&#xff08;Behavior&#xff09;&#xff1a;通過成員方法&#xff08;Method&#xff09;實現 class Person {String name;int age;void eat() {System.o…

Qt學習Day0:Qt簡介

0. 關于Qt Qt是C的實踐課&#xff0c;之前在C中學習的語法可以有具體的應用場景。Qt的代碼量很大&#xff0c;不要死記硬背&#xff0c;學會查詢文檔的能力更加重要。 建議提升一下相關單詞的儲備量&#xff1a; 1. Qt是什么&#xff1f; Qt是一個基于C語言的圖形用戶界面&a…

React知識框架

一、核心概念 1. 組件化開發 核心思想&#xff1a;將 UI 拆分為獨立、可復用的組件&#xff08;函數組件/類組件&#xff09;。組件特性&#xff1a;props&#xff08;接收參數&#xff09;、state&#xff08;組件狀態&#xff09;、生命周期&#xff08;類組件特有&#xf…

Django之賬號登錄及權限管理

賬號登錄及權限管理 目錄 1.登錄功能 2.退出登錄 3.權限管理 4.代碼展示合集 這篇文章, 會講到如何實現賬號登錄。賬號就是我們上一篇文章寫的賬號管理功能, 就使用那里面已經創建好的賬號。這一次登錄, 我們分為三種角色, 分別是員工, 領導, 管理員。不同的角色, 登錄進去…

[學習]RTKLib詳解:convkml.c、convrnx.c與geoid.c

本文是 RTKLlib詳解 系列文章的一篇&#xff0c;目前該系列文章還在持續總結寫作中&#xff0c;以發表的如下&#xff0c;有興趣的可以翻閱。 [學習] RTKlib詳解&#xff1a;功能、工具與源碼結構解析 [學習]RTKLib詳解&#xff1a;pntpos.c與postpos.c [學習]RTKLib詳解&…

java 破解aspose.words 18.6 使用

資源包&#xff1a;https://download.csdn.net/download/qq_36598111/90787167 jar包是破解過的&#xff0c;直接可以使用。 引入jar&#xff0c;要引入本地的&#xff0c;不要直接引入倉庫的 <dependency><groupId>com.aspose</groupId><artifactId>…

vue使用rules實現表單校驗——校驗用戶名和密碼

編寫校驗規則 常規校驗 const rules {username: [{ required: true, message: 請輸入用戶名, trigger: blur },{ min: 5, max: 16, message: 長度在 5 到 16 個字符, trigger: blur }],password: [{ required: true, message: 請輸入密碼, trigger: blur },{ min: 5, max: 1…

寶塔服務安裝使用的保姆級教程

寶塔介紹&#xff1a; 寶塔面板&#xff08;BT Panel&#xff09; 是一款 國產的服務器運維管理面板&#xff0c;主要用于簡化 Linux/Windows 服務器的網站、數據庫、FTP、防火墻等管理操作。它通過圖形化界面&#xff08;Web端&#xff09;和命令行工具&#xff08;bt 命令&a…

數字化轉型-4A架構之數據架構

4A架構系列文章 數字化轉型-4A架構&#xff08;業務架構、應用架構、數據架構、技術架構&#xff09; 數字化轉型-4A架構之業務架構 數字化轉型-4A架構之應用架構 數字化轉型-4A架構之數據架構 數字化轉型-4A架構之技術架構 數據架構 Data Architecture&#xff08;DA&…