擴展摩爾投票法:找出出現次數超過 n/3 的元素

文章目錄

    • 問題描述
    • 關鍵洞察
    • 算法原理
    • Java 實現
    • 算法演示
      • 投票階段
      • 驗證階段
    • 復雜度分析
    • 算法關鍵點
    • 通用化公式
    • 實際應用場景
    • 邊界情況處理
    • 總結

標簽:LeetCode 169, 摩爾投票法, 多數元素, 算法擴展, 數組處理

在解決多數元素問題時,我們學習了經典的摩爾投票法處理出現次數超過 n/2 的情況。那么,當問題擴展為找出出現次數超過 n/3 的元素時,該如何解決呢?本文將深入探討摩爾投票法的擴展應用。

問題描述

給定一個大小為 n 的整數數組,找出所有出現次數 大于 ?n/3? 的元素。要求時間復雜度 O(n),空間復雜度 O(1)。

示例:

輸入:[1,1,1,3,3,2,2,2]
輸出:[1,2]
解釋:1 和 2 都出現 3 次,大于 ?8/3? = 2

關鍵洞察

  1. 數學約束:出現次數超過 n/3 的元素最多有 2 個

    • 如果 3 個元素都超過 n/3,總次數將超過 n,不可能
  2. 擴展思路:使用兩個候選元素和兩個計數器

    • 維護兩個候選元素 candidate1, candidate2
    • 維護對應的計數器 count1, count2
    • 使用抵消策略處理其他元素

算法原理

  1. 初始化:兩個候選元素設為特殊值(如 null),計數器設為 0
  2. 投票階段
    • 當前元素等于任一候選元素 → 對應計數器加 1
    • 當任一計數器為 0 → 將當前元素設為新候選
    • 當前元素不等于任一候選 → 兩個計數器都減 1(抵消)
  3. 驗證階段:檢查候選元素是否真正超過 n/3

Java 實現

import java.util.*;class Solution {public List<Integer> majorityElement(int[] nums) {// 初始化候選元素和計數器Integer candidate1 = null;Integer candidate2 = null;int count1 = 0;int count2 = 0;// 第一輪遍歷:投票過程for (int num : nums) {if (candidate1 != null && num == candidate1) {count1++;} else if (candidate2 != null && num == candidate2) {count2++;} else if (count1 == 0) {candidate1 = num;count1 = 1;} else if (count2 == 0) {candidate2 = num;count2 = 1;} else {// 抵消操作count1--;count2--;}}// 第二輪遍歷:驗證候選元素List<Integer> result = new ArrayList<>();count1 = 0;count2 = 0;for (int num : nums) {if (candidate1 != null && num == candidate1) count1++;if (candidate2 != null && num == candidate2) count2++;}int n = nums.length;if (count1 > n/3) result.add(candidate1);if (count2 > n/3) result.add(candidate2);return result;}
}

算法演示

以數組 [1,2,3,2,1,2,3,1,2] 為例(n=9,需要出現次數 > 3)

投票階段

元素candidate1count1candidate2count2操作說明
111null0初始化 candidate1
21121初始化 candidate2
31020抵消 (1-1, 2-1)
21021count1=0, 使用candidate2
11121重置 candidate1
21122增加 candidate2
31021抵消
11121重置 candidate1
21122增加 candidate2

驗證階段

  • candidate1 = 1 → 出現次數:4 > 3
  • candidate2 = 2 → 出現次數:4 > 3
  • 結果:[1, 2]

復雜度分析

  • 時間復雜度:O(2n) = O(n),兩次線性遍歷
  • 空間復雜度:O(1),僅使用常數空間(兩個候選元素和兩個計數器)

算法關鍵點

  1. 候選元素初始化:使用包裝類型 Integer 以便處理 null 值
  2. 條件判斷順序:優先檢查是否匹配候選元素,再檢查計數器是否為0
  3. 抵消策略:當元素與兩個候選元素都不同時,同時減少兩個計數器
  4. 驗證必要性:投票結果需要驗證,因為:
    • 計數器可能被其他元素干擾
    • 數組可能沒有滿足條件的元素

通用化公式

摩爾投票法可進一步擴展為尋找出現次數超過 n/k 的元素:

  1. 最多有 k-1 個候選元素
  2. 維護 k-1 個候選元素和計數器
  3. 投票階段:
    • 匹配候選 → 對應計數器加1
    • 計數器為0 → 設為新候選
    • 都不匹配 → 所有計數器減1
  4. 驗證候選元素的實際出現次數

實際應用場景

  1. 大數據分析:從海量數據中找出高頻項
  2. 網絡流量監控:檢測異常高頻訪問
  3. 推薦系統:識別熱門內容
  4. 日志分析:查找頻繁出現的錯誤類型
  5. 選舉系統:統計多候選人得票情況

邊界情況處理

  1. 候選元素為 null 的情況

    if (candidate1 != null && num == candidate1)
    
  2. 數組長度小于3

    • 當 n < 3 時,?n/3? = 0,所有元素都滿足條件
    • 但實際需統計出現次數 > 0 的元素(根據定義)
  3. 沒有滿足條件的元素

    // 驗證階段會過濾掉不滿足條件的候選
    if (count1 > n/3) result.add(candidate1);
    

總結

擴展摩爾投票法展示了算法設計的精妙之處:

  1. 數學洞察:利用問題約束(最多 k-1 個候選)
  2. 空間優化:O(1) 空間解決統計問題
  3. 高效性:O(n) 時間復雜度
  4. 通用性:可擴展為 n/k 問題

掌握這種擴展思維,能幫助我們在面對各類統計問題時,設計出高效的空間優化算法。摩爾投票法不僅是解決多數元素問題的利器,更是算法設計中"以空間換時間"思想的經典體現。

思考挑戰:如何擴展該算法處理出現次數超過 n/4 的情況?歡迎在評論區分享你的解決方案!

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

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

相關文章

Git:現代軟件開發的基石——原理、實踐與行業智慧·優雅草卓伊凡

Git&#xff1a;現代軟件開發的基石——原理、實踐與行業智慧優雅草卓伊凡 一、Git的本質與核心原理 1. 技術定義 Git是一個分布式版本控制系統&#xff08;DVCS&#xff09;&#xff0c;由Linus Torvalds在2005年為管理Linux內核開發而創建。其核心是通過快照&#xff08;Sna…

程序人生-hello’s P2P

計算機系統 大作業 題 目 程序人生-hello’s P2P 專 業 計算機與電子通信類 學   號 2023111990 班   級 23L0514 學 生 袁騁 指 導 教 師 史…

Java設計模式之設計原則

Java設計模式 Java設計模式主要原則是開閉原則&#xff0c;即對擴展開放&#xff0c;對修改關閉。由此衍生出5大原則&#xff1a;單一職責原則&#xff0c;里式替換原則&#xff0c;迪米特原則&#xff0c;接口隔離職責&#xff0c;依賴倒置原則。1、開閉原則 開閉原則&#x…

使用 ssld 提取CMS 簽名并重簽名

拿SpringBoard的cms簽名和entitlements.xml&#xff0c;對tihook.dylib進行重簽名 工具來源&#xff1a;https://github.com/eksenior/ssld

WebFuture:測試郵件發送失敗

問題描述&#xff1a;測試郵件發送失敗 問題分析&#xff1a; 查看報錯是模擬發送郵件請將systemsettings.json中的EnabledMail設為false&#xff01; 解決方案&#xff1a; 網站根目錄找到Configuration&#xff0c;如下圖所示&#xff0c;將systemsettings.json中的Enabled…

LiveNVR 直播流拉轉:Onvif/RTSP/RTMP/FLV/HLS 支持海康宇視天地 SDK 接入-視頻廣場頁面集成與視頻播放說明

LiveNVR直播流拉轉&#xff1a;Onvif/RTSP/RTMP/FLV/HLS支持海康宇視天地SDK接入-視頻廣場頁面集成與視頻播放說明 一、視頻頁面集成1.1 關閉接口鑒權1.2 視頻廣場頁面集成1.2.1 隱藏菜單欄1.2.2 隱藏播放頁面分享鏈接 1.3 其它頁面集成 二、播放分享頁面集成2.1 獲取 iframe 代…

12. CSS 布局與樣式技巧

在前端開發中&#xff0c;CSS 是控制頁面樣式和布局的核心技術。本文總結了 CSS 布局中的關鍵概念和實用技巧&#xff0c;包括 overflow 屬性、背景圖片處理、精靈圖技術、display 屬性、浮動布局以及清除浮動的方法。 一、overflow 屬性詳解 overflow 屬性用于控制當元素內容…

OpenCV---Canny邊緣檢測

一、基本概念與核心作用 Canny邊緣檢測是計算機視覺中最經典的邊緣檢測算法之一&#xff0c;由John Canny于1986年提出。其核心目標是在噪聲圖像中提取精確、單像素寬、連續的邊緣&#xff0c;廣泛應用于&#xff1a; 目標檢測預處理&#xff08;如Robomaster中燈條、裝甲板的…

提效-點擊跳轉到源碼

1、localhost項目 例如【鯨島】這個中臺項目啟動地址是localhost。 使用chrome中的【click-to-react-component 】擴展&#xff0c; alt 鼠標左鍵 選擇dom后跳轉到對應文件。 click-to-react-component的原理&#xff08;來自ai&#xff09; click-to-react-component 的工作…

FeignClient發送https請求時的證書驗證原理分析

背景 微服務之間存在調用關系&#xff0c;且部署為 SSL 協議時&#xff0c;Feignt 請求報異常&#xff1a; Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find vali…

性能優化關鍵:link、script和meta的正確打開方式

link 標簽的主要屬性及其作用 屬性是否必填作用描述示例值rel是定義當前文檔與鏈接資源的關系&#xff08;必須屬性&#xff09;。常見值&#xff1a;stylesheet, icon, preload, preconnect 等。rel"stylesheet" rel"icon"href是指定鏈接資源的URL。href…

Linux `less` 命令深度解析與高階應用指南

Linux `less` 命令深度解析與高階應用指南 一、核心功能解析1. 基本作用2. 與類似工具對比二、選項系統詳解1. 常用基礎選項2. 高階選項組合三、高階應用場景1. 日志分析系統2. 代碼審查系統3. 數據管道處理四、特殊文件處理1. 大文件優化查看2. 二進制文件分析五、交互式命令大…

影刀RPA-20-高級操作題2

一、題目 二、鏈接 方法一&#xff1a;影刀應用分享: 高級考試題2-第二次 方法二&#xff1a;影刀應用分享: 高級考試題2 三、代碼 方法一&#xff1a; import xbot from xbot import print, sleep from .import package from .package import variables as glv from xbot…

C# NX二次開發-獲取面法向和UV等數據

通過ufun函數UF_MODL_ask_face_props可以獲取到面的法向數據和UV和半徑等數據。 代碼如下&#xff1a; double[] uvs new double[4];double[] param new double[2];double[] point new double[3];double[] u1 new double[3];double[] v1 new double[3];double[] u2 new d…

SpringBoot整合Sa-Token:實現RBAC權限模型

Java系列文章 文章目錄 Java系列文章前言一、基礎概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 環境準備 二、表結構設計2.1 ER圖示例2.2 數據庫表設計2.2.1 用戶表2.2.2 角色表2.2.3 部門表2.2.4 權限表 三、SpringBoot整合Sa-Token3.1 sa-token基礎配置3.1.1 Maven配置3…

工商業儲能的“智慧大腦”:解密 Acrel-2000ES EMS 的核心功能與價值

安科瑞電氣顧強 市場背景&#xff1a;工商業儲能加速崛起 2022年中國已并網的儲能項目中&#xff0c;用戶側并網占比為8.36%&#xff0c;其中工商業儲能占據了用戶側高達98.6%的份額。驅動這一市場發展的關鍵因素日益顯著&#xff1a; 1.峰谷價差擴大&#xff1a; 全國各省市…

vue+threeJs 根據屏幕調整gltf模型的大小、重心、并更換騎車整體顏色

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“vuethreeJs 根據屏幕調整gltf模型的大小、重心、并更換騎車整體顏色”。 項目案例示意圖 1.整體更換gltf模型的顏色 定義&#xff1a;整體代碼如下。顏色是事先設定的 const colorAry reactive(["rgb(21…

03 基于 java udp 做一個dns服務器 和 一個dns代理服務器

前言 這個也是 來自于一個朋友的需求 最終的目的是實現一個 dns 代理服務器, 當然 這本質也是一個 dns 服務器 并且 dns 代理服務器是依賴于 一個 dns 服務器的, 因此 順便給一個 dns 服務器的 demo 這里 主要是 基于 udp 的一個 dns 請求, 響應數據的交互 dns 服務器 …

【HITCSAPP 哈工大計算機系統期末大作業】 程序人生-Hello’s P2P

計算機系統 大作業 題 目 程序人生-Hello’s P2P 專 業 計算機與電子通信類 學   號 2023112915 班   級 23L0505 學 生 楊昕彥 指 導 教 師 劉宏偉 計算機科學…

第十周作業

一、CSRF 1、DVWA-High等級 2、使用Burp生成CSRF利用POC并實現攻擊 二、SSRF&#xff1a;file_get_content實驗&#xff0c;要求獲取ssrf.php的源碼 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro