排序題目:多數元素 II

文章目錄

  • 題目
    • 標題和出處
    • 難度
    • 題目描述
      • 要求
      • 示例
      • 數據范圍
      • 進階
  • 前言
  • 解法一
    • 思路和算法
    • 代碼
    • 復雜度分析
  • 解法二
    • 思路和算法
    • 代碼
    • 復雜度分析
  • 解法三
    • 思路和算法
    • 代碼
    • 復雜度分析

題目

標題和出處

標題:多數元素 II

出處:229. 多數元素 II

難度

3 級

題目描述

要求

給定大小為 n \texttt{n} n 的數組 nums \texttt{nums} nums,找出其中所有出現超過 ? n 3 ? \Big\lfloor \dfrac{\texttt{n}}{\texttt{3}} \Big\rfloor ?3n?? 次的元素。

示例

示例 1:

輸入: nums = [3,2,3] \texttt{nums = [3,2,3]} nums?=?[3,2,3]
輸出: [3] \texttt{[3]} [3]

示例 2:

輸入: nums = [1] \texttt{nums = [1]} nums?=?[1]
輸出: [1] \texttt{[1]} [1]

示例 3:

輸入: nums = [1,2] \texttt{nums = [1,2]} nums?=?[1,2]
輸出: [1,2] \texttt{[1,2]} [1,2]

數據范圍

  • n = nums.length \texttt{n} = \texttt{nums.length} n=nums.length
  • 1 ≤ n ≤ 5 × 10 4 \texttt{1} \le \texttt{n} \le \texttt{5} \times \texttt{10}^\texttt{4} 1n5×104
  • -10 9 ≤ nums[i] ≤ 10 9 \texttt{-10}^\texttt{9} \le \texttt{nums[i]} \le \texttt{10}^\texttt{9} -109nums[i]109

進階

你可以使用線性時間復雜度和 O(1) \texttt{O(1)} O(1) 空間復雜度解決此問題嗎?

前言

這道題是「多數元素」的進階,要求找出數組中所有出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素。這道題也可以使用哈希表計數、排序和摩爾投票三種解法得到答案。

長度是 n n n 的數組中,最多有 2 2 2 個出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素。可以使用反證法證明。

假設有 3 3 3 個出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素,這 3 3 3 個元素的出現次數都不小于 ? n 3 ? + 1 \Big\lfloor \dfrac{n}{3} \Big\rfloor + 1 ?3n??+1,因此這 3 3 3 個元素的總出現次數至少為 3 × ? n 3 ? + 3 3 \times \Big\lfloor \dfrac{n}{3} \Big\rfloor + 3 3×?3n??+3。由于 ? n 3 ? > n 3 ? 1 \Big\lfloor \dfrac{n}{3} \Big\rfloor > \dfrac{n}{3} - 1 ?3n??>3n??1,因此 3 × ? n 3 ? + 3 > 3 × ( n 3 ? 1 ) + 3 = 3 × n 3 ? 3 + 3 = n 3 \times \Big\lfloor \dfrac{n}{3} \Big\rfloor + 3 > 3 \times (\dfrac{n}{3} - 1) + 3 = 3 \times \dfrac{n}{3} - 3 + 3 = n 3×?3n??+3>3×(3n??1)+3=3×3n??3+3=n,即這 3 3 3 個元素的總出現次數一定超過 n n n,和數組長度是 n n n 矛盾。因此數組中不可能有 3 3 3 個出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素,最多有 2 2 2 個出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素。

解法一

思路和算法

最直觀的解法是統計數組中每個元素的出現次數,然后尋找出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素。

遍歷數組,使用哈希表記錄每個元素的出現次數,遍歷結束之后即可得到數組中每個元素的出現次數。然后遍歷哈希表,對于哈希表中的每個元素得到出現次數,將出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素添加到結果中。

代碼

class Solution {public List<Integer> majorityElement(int[] nums) {Map<Integer, Integer> counts = new HashMap<Integer, Integer>();for (int num : nums) {counts.put(num, counts.getOrDefault(num, 0) + 1);}List<Integer> majorities = new ArrayList<Integer>();int n = nums.length;Set<Integer> set = counts.keySet();for (int num : set) {if (counts.get(num) > n / 3) {majorities.add(num);}}return majorities;}
}

復雜度分析

  • 時間復雜度: O ( n ) O(n) O(n),其中 n n n 是數組 nums \textit{nums} nums 的長度。遍歷數組統計每個元素的出現次數需要 O ( n ) O(n) O(n) 的時間,遍歷哈希表得到多數元素也需要 O ( n ) O(n) O(n) 的時間。

  • 空間復雜度: O ( n ) O(n) O(n),其中 n n n 是數組 nums \textit{nums} nums 的長度。需要創建哈希表記錄每個元素的出現次數,哈希表中的元素個數不超過 n n n

解法二

思路和算法

首先將數組排序,排序后的數組滿足相等的元素一定出現在數組中的相鄰位置。如果一個元素在數組中的出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n??,則排序后的數組中存在至少 ? n 3 ? + 1 \Big\lfloor \dfrac{n}{3} \Big\rfloor + 1 ?3n??+1 個連續的元素都等于該元素,即一定存在兩個差為 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的下標處的元素都等于該元素。

將數組 nums \textit{nums} nums 排序之后遍歷數組 nums \textit{nums} nums,對于下標 i i i,當 i ≥ ? n 3 ? i \ge \Big\lfloor \dfrac{n}{3} \Big\rfloor i?3n?? 時,如果 nums [ i ] = nums [ i ? ? n 3 ? ] \textit{nums}[i] = \textit{nums}[i - \Big\lfloor \dfrac{n}{3} \Big\rfloor] nums[i]=nums[i??3n??],則 nums [ i ] \textit{nums}[i] nums[i] 是出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素。

為了避免重復計算,當 i < n ? 1 i < n - 1 i<n?1 nums [ i ] = nums [ i + 1 ] \textit{nums}[i] = \textit{nums}[i + 1] nums[i]=nums[i+1] 時跳過下標 i i i,只有當下標 i i i 的右側沒有與 nums [ i ] \textit{nums}[i] nums[i] 相等的元素時才判斷 nums [ i ] = nums [ i ? ? n 3 ? ] \textit{nums}[i] = \textit{nums}[i - \Big\lfloor \dfrac{n}{3} \Big\rfloor] nums[i]=nums[i??3n??] 是否成立,如果成立則將 nums [ i ] \textit{nums}[i] nums[i] 添加到結果中。

代碼

class Solution {public List<Integer> majorityElement(int[] nums) {Arrays.sort(nums);List<Integer> majorities = new ArrayList<Integer>();int n = nums.length;for (int i = n / 3; i < n; i++) {int num = nums[i];if (i < n - 1 && num == nums[i + 1]) {continue;}if (num == nums[i - n / 3]) {majorities.add(num);}}return majorities;}
}

復雜度分析

  • 時間復雜度: O ( n log ? n ) O(n \log n) O(nlogn),其中 n n n 是數組 nums \textit{nums} nums 的長度。排序需要 O ( n log ? n ) O(n \log n) O(nlogn) 的時間。

  • 空間復雜度: O ( log ? n ) O(\log n) O(logn),其中 n n n 是數組 nums \textit{nums} nums 的長度。排序需要 O ( log ? n ) O(\log n) O(logn) 的遞歸調用棧空間。

解法三

思路和算法

原始的摩爾投票算法用于找到出現次數大于一半的元素,其時間復雜度是 O ( n ) O(n) O(n),空間復雜度是 O ( 1 ) O(1) O(1)。摩爾投票算法可以推廣到尋找出現次數大于 ? n k ? \Big\lfloor \dfrac{n}{k} \Big\rfloor ?kn?? 的元素,其中 k k k 是大于 1 1 1 的正整數。

由于出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 的元素不可能超過 2 2 2 個,因此維護 2 2 2 個候選元素 majority 1 \textit{majority}_1 majority1? majority 2 \textit{majority}_2 majority2?,以及兩個候選元素的出現次數 count 1 \textit{count}_1 count1? count 2 \textit{count}_2 count2?,初始時候選元素和出現次數都是 0 0 0

遍歷數組,當遍歷到元素 num \textit{num} num 時,執行如下操作。

  1. 比較 num \textit{num} num 是否和候選元素相等,如果相等則將相應的出現次數加 1 1 1

    1. 如果 num = majority 1 \textit{num} = \textit{majority}_1 num=majority1?,則將 count 1 \textit{count}_1 count1? 1 1 1

    2. 否則,如果 num = majority 2 \textit{num} = \textit{majority}_2 num=majority2?,則將 count 2 \textit{count}_2 count2? 1 1 1

  2. 如果 num \textit{num} num 和兩個候選元素都不相等,則判斷兩個候選元素的出現次數是否為 0 0 0,如果為 0 0 0 則更新候選元素和出現次數。

    1. 如果 count 1 = 0 \textit{count}_1 = 0 count1?=0,則將 majority 1 \textit{majority}_1 majority1? 更新為 num \textit{num} num,并將 count 1 \textit{count}_1 count1? 1 1 1

    2. 否則,如果 count 2 = 0 \textit{count}_2 = 0 count2?=0,則將 majority 2 \textit{majority}_2 majority2? 更新為 num \textit{num} num,并將 count 2 \textit{count}_2 count2? 1 1 1

  3. 如果 num \textit{num} num 和兩個候選元素都不相等且兩個候選元素的出現次數都大于 0 0 0,則 num \textit{num} num 和兩個候選元素抵消,將 count 1 \textit{count}_1 count1? count 2 \textit{count}_2 count2? 都減 1 1 1

遍歷結束之后,得到兩個候選元素。再次遍歷數組,統計兩個候選元素在數組中的出現次數,當出現次數大于 ? n 3 ? \Big\lfloor \dfrac{n}{3} \Big\rfloor ?3n?? 時將候選元素添加到結果中。

代碼

class Solution {public List<Integer> majorityElement(int[] nums) {int majority1 = 0, majority2 = 0;int count1 = 0, count2 = 0;for (int num : nums) {if (num == majority1) {count1++;} else if (num == majority2) {count2++;} else if (count1 == 0) {majority1 = num;count1++;} else if (count2 == 0) {majority2 = num;count2++;} else {count1--;count2--;}}count1 = 0;count2 = 0;for (int num : nums) {if (num == majority1) {count1++;} else if (num == majority2) {count2++;}}List<Integer> majorities = new ArrayList<Integer>();int n = nums.length;if (count1 > n / 3) {majorities.add(majority1);}if (count2 > n / 3) {majorities.add(majority2);}return majorities;}
}

復雜度分析

  • 時間復雜度: O ( n ) O(n) O(n),其中 n n n 是數組 nums \textit{nums} nums 的長度。需要遍歷數組 nums \textit{nums} nums 兩次。

  • 空間復雜度: O ( 1 ) O(1) O(1)

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

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

相關文章

css高度0到高度auto,過渡的設置

1.css從高度0到高度auto,過渡設置 方法(vue代碼) 你可以通過設置transform: scale(0);到 transform: scale(1); 來實現,具體代碼 你也可以通過設置transform: scaleY(0);到 transform: scaleY(1); 這兩種展示的效果不一樣,你可以看看你喜歡那種 // css代碼// 原來的css類 .s…

港口危險貨物安全管理人員考試題庫(含答案)

一、單選題 1.化學品安全標簽內容中警示詞有( )種分別進行危害程度的警示。 A、3 B、4 C、5 參考答案:A 2.運輸放射性物品&#xff0c;應當使用( )的放射性物品運輸包裝容器(以下簡稱運輸容器)。 A、專業 B、專用 C、統一 D、定制 參考答案:B 3.庫區儀表及計算機監控管理系…

中電金信:金Gien樂道 | 6月熱門新聞盤點 回顧這一月的焦點事件

“以檢之力 e企守護”——上海市檢一分院與中電金信開展聯學聯建 6月24日&#xff0c;上海市人民檢察院第一分院與中電金信數字科技集團股份有限公司聯合開展“以檢之力 e企守護”聯學聯建活動。雙方共同參觀了全國檢察機關證券期貨犯罪辦案基地和重大職務犯罪案件辦理&#xf…

HTML5與3D打印:探索網頁內容的物理化可能

隨著科技的飛速發展&#xff0c;互聯網與物理世界的交匯點日益增多。HTML5作為當前網頁開發的主流標準&#xff0c;不僅推動了網頁內容的豐富性和互動性&#xff0c;還在與3D打印技術的結合中&#xff0c;展現出了將網頁內容物理化的巨大潛力。本文將探討HTML5與3D打印的結合點…

C++ 中的數據類型

C規定在創建一個變量或者常量時&#xff0c;必須要指定出相應的數據類型&#xff0c;否則無法給變量分配內存. 1 整型 作用&#xff1a;整型變量表示的是整數類型的數據 C中能夠表示整型的類型有以下幾種方式&#xff0c;區別在于所占內存空間不同&#xff1a; 數據類型占用…

python(6)numpy的使用詳細講解

在numpy中&#xff0c;最基本的數據結構是數組&#xff0c;因此我們首先需要了解如何創建一個數組。numpy提供了多種數組創建方法&#xff0c;包括從列表或元組創建、從文件中讀取數據、使用特定函數創建等。下面是一些常用的創建方法&#xff1a; 一、創建數組 1. 從列表或元…

【MySQL備份】Percona XtraBackup基礎篇

目錄 1.關于Percona XtraBackup 2. Percona XtraBackup有哪些特點&#xff1f; 3.安裝Percona XtraBackup 3.1.環境信息 3.2.安裝步驟 4. xtrabackup內部流程圖 5.Percona XtraBackup基礎語法 5.1.全量備份 5.2.增量備份 5.2.1.基于全量備份的增量備份 5.2.2.基于前…

[leetcode]max-consecutive-ones 最大連續1的個數

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findMaxConsecutiveOnes(vector<int>& nums) {int maxCount 0, count 0;int n nums.size();for (int i 0; i < n; i) {if (nums[i] 1) {count;maxCount max(maxCount, count);} else…

安裝和微調大模型(基于LLaMA-Factory)

打開終端&#xff08;在Unix或macOS上&#xff09;或命令提示符/Anaconda Prompt&#xff08;在Windows上&#xff09;。 創建一個名為lora的虛擬環境并指定Python版本為3.9。 conda create --name lora python3.9激活新創建的虛擬環境。 conda activate lora克隆項目。 git …

詳解COB顯示屏的技術特點

COB&#xff08;Chip on Board&#xff09;顯示屏作為一種采用倒裝COB封裝技術的LED顯示屏&#xff0c;在顯示效果以及使用穩定性跟防護性方面&#xff0c;擁有更大優勢&#xff0c;今天跟隨COB顯示屏廠家中品瑞科技一起來看看&#xff0c;COB顯示屏的技術特點&#xff1a; 1、…

如何在OpenEuler 上快速部署一套Zabbix7.0監控系統

如何在OpenEuler 上快速部署一套Zabbix監控系統 一、環境信息 用途機器IP操作系統備注zabbix-server172.22.33.180openeuler 22.03 LTS SP37.0 LTS 版本&#xff0c;容器部署zabbix-agent172.16.10.182openeuler 22.03 LTS SP37.0 源碼編譯部署 二、Docker 部署 2.1 二進制…

【小白入門】關于視頻剪輯該自學還是報課?

★解密&#xff1a;【賦能計劃—剪輯小白入門】 ★ 在這個視頻流量為王的時代&#xff0c;人人都想打造屬于自己的IP&#xff0c;今年更是有許多企業家也紛紛下場干起來了&#xff0c;網上曾流行這樣的一句話&#xff1a;“現在人們的生活方式改變了&#xff0c;所有事情都值得…

Anti-Canine Heartworm Antibody (Chicken) - HRP Conjugated

犬心絲蟲&#xff08;學名Dirofilaria immitis&#xff09;是一種寄生絲蟲&#xff0c;通過蚊子叮咬而傳播。感染犬在早期階段&#xff0c;大多不會出現癥狀。隨著病情發展&#xff0c;將出現咳嗽、呼吸困難等癥狀&#xff0c;并伴有右心功能衰竭&#xff0c;最終全身衰弱或虛脫…

檢索增強生成RAG系列3--RAG優化之文檔處理

在上一章中羅列了對RAG準確度的幾個重要關鍵點&#xff0c;主要包括2方面&#xff0c;這一章就針對其中一方面&#xff0c;來做詳細的講解以及其解決方案。 目錄 1 文檔解析1.1 文檔解析工具1.2 實戰經驗1.3 代碼演示 2 文檔分塊2.1 分塊算法2.2 實戰經驗2.3 代碼演示 3 文檔e…

VLAN基礎

一、什么是Vlan VLAN&#xff08;Virtual Local Area Network&#xff09;是虛擬局域網的簡稱&#xff0c;是一種將單一物理局域網&#xff08;LAN&#xff09;在邏輯層面上劃分為多個獨立的廣播域的技術。每個VLAN都是一個獨立的廣播域&#xff0c;其內部主機可以直接通信&am…

python自動化辦公之shutil

目錄 1復制文件&#xff0c;此時存在2份相同文件 2移動文件&#xff0c;此時僅有1份文件 3刪除文件&#xff0c;此時0份文件 用到的庫&#xff1a;shutil&#xff0c;os 實現的效果&#xff1a;復制文件&#xff0c;移動文件&#xff0c;刪除文件 代碼&#xff1a; 1復制…

并發請求數量限制

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>并發請求數量限制</title> </head> <…

使用Colly庫進行高效的網絡爬蟲開發

引言 隨著互聯網技術的飛速發展&#xff0c;網絡數據已成為信息獲取的重要來源。網絡爬蟲作為自動獲取網頁內容的工具&#xff0c;在數據分析、市場研究、信息聚合等領域發揮著重要作用。本文將介紹如何使用Go語言中的Colly庫來開發高效的網絡爬蟲。 什么是Colly庫&#xff1…

力扣974.和可被K整除的子數組

力扣974.和可被K整除的子數組 將余數相同的做差 若為負數要翻正再存入哈希表若為正數要存入哈希表統一操作 (sj % k k ) % k class Solution {public:int subarraysDivByK(vector<int>& nums, int k) {int n nums.size();vector<long> s(n1);for(int i0;i…

超聲波清洗機怎么選?極力推薦四款口碑大牌超聲波清洗機

相信大家都知道超聲波清洗機&#xff0c;每次眼鏡臟的時候&#xff0c;去眼鏡店里讓老板幫忙清洗&#xff0c;她們用的就是超聲波清洗機&#xff0c;通過超聲波的原理深入物品深處清潔&#xff0c;清潔效果非常好。相對手洗的方式&#xff0c;超聲波清洗機能夠保護鏡片在清洗過…