[資料結構與演算法]15 兩行程式碼就可以搞定求眾數,但還有更巧的
這個週末刷了幾道演算法題,把其中一個比較不錯的分享給你~
給定一個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。
你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。
示例 1:
輸入: [3,2,3]
輸出: 3
示例 2:
輸入: [2,2,1,1,1,2,2]
輸出: 2
哦,原來是求眾數,注意一下哈,這裡的眾數是指"在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素",不要問我為什麼要你們注意一下這個條件,因為我鑽牛角尖了!
拿到這個題目,我的第一反應就是,那我給這個陣列排個序然後取中間的值不就得了?
所以程式碼就只有兩行:
Arrays.sort(nums);
return nums[nums.length >> 1];
寫完程式執行,一點兒毛病都沒有,簡簡單單兩行程式碼就搞定,那一刻我覺得我就是個天才!
後來夢醒了,冷靜分析了一下,我去這樣的程式碼簡單是簡單,但是時間複雜度是 O(nlogn) ,空間複雜度是 O(logn)
所以有沒有更好的解決方案呢?能讓它的時間複雜度和空間複雜度都降下來
必須得有哇!要不然我寫這篇文章是為了啥
這種比較好的解決方案就是摩爾投票法
這個方法理解起來有點兒繞,我先來講講,這一塊兒看懂了,我們們再往下走
先回到現實生活中,投票的時候我們們是怎麼投的呢?大家每個人都選一個人,然後開始拆開紙團瞅瞅選的是誰,剛開始預設大家都是 0 票,然後紙條上投的是誰,這個人就多一票,最後看誰的票數比較多.
回到我們們這個題目,既然是眾數,而且出現的次數大於 ⌊ n/2 ⌋ ,那我們可以假設一個數就是要求的眾數,同時設定這個數字出現的次數為 0 ,然後和接下來的數字進行比較,如果一樣呢,我們們把這個數字出現的次數加上 1 ,如果不一樣,就讓次數減 1 ,當這個值減到 0 時,說明剛開始假設的數字不是眾數,那就換當前的這個數字,繼續迴圈
這樣最後這個數字出現的次數一定是大於等於 0 的,要不然就不符合 出現的次數大於 ⌊ n/2 ⌋
這個題意了
最後,將真正的眾數返回即可
具體程式碼可見下面:
int count = 0 ;
Integer candidate = null;
for(int num : nums){
if (count == 0){
candidate = num;
}
count += ( num == candidate ) ? 1 : -1 ;
}
return candidate;
分析一下,這樣實現的時間複雜度是 O(n) ,空間複雜度是 O(1)
和剛開始使用的方法相比,好了許多
你有沒有更巧妙的方法實現,歡迎評論區和我交流哇
最後,感謝您的閱讀~
相關文章
- 資料結構與演算法——兩個大整數的乘積問題資料結構演算法
- 有沒有go描述的資料結構與演算法的書?Go資料結構演算法
- 『資料結構與演算法』棧:詳解與程式碼實現資料結構演算法
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 演算法題:求眾數演算法
- Java資料結構與演算法面試題-兩數之和 作者:哇塞大嘴好帥Java資料結構演算法面試題
- 優化的求眾數方法 - 摩爾投票演算法(演算法思想+求眾數的三種方法+摩爾投票演算法改進版求眾數 II)優化演算法
- 資料結構與演算法——排序演算法-基數排序資料結構演算法排序
- 【一份程式碼搞定資料結構】紅黑樹(更新中)資料結構
- 資料結構與演算法資料結構演算法
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 【演算法】求眾數-js解法演算法JS
- 演算法:Majority Element(求眾數)演算法
- 資料結構與演算法:圖形結構資料結構演算法
- 資料結構與演算法之間有何關係?資料結構演算法
- JavaScript 的資料結構和演算法 - 棧程式碼篇JavaScript資料結構演算法
- JavaScript 的資料結構和演算法 - 連結串列程式碼篇JavaScript資料結構演算法
- 【演算法與資料結構專場】BitMap演算法基本操作程式碼實現演算法資料結構
- 【JavaScript 演算法與資料結構】JavaScript演算法資料結構
- 資料結構與演算法03資料結構演算法
- 演算法與資料結構——序演算法資料結構
- 資料結構與演算法——概述資料結構演算法
- 資料結構與演算法-堆資料結構演算法
- 資料結構與演算法02資料結構演算法
- 資料結構與演算法(1)資料結構演算法
- 資料結構與演算法——排序資料結構演算法排序
- 資料結構與演算法——字串資料結構演算法字串
- 資料結構與演算法(java)資料結構演算法Java
- 資料結構與演算法 - 串資料結構演算法
- 【資料結構與演算法】bitmap資料結構演算法
- 資料結構與演算法之線性結構資料結構演算法
- 資料結構與演算法-連結串列資料結構演算法
- 資料結構與演算法——給定整數A1,A2,....An,....(可能有負數),求該資料序列的最大子序列的和資料結構演算法
- python演算法與資料結構-什麼是資料結構Python演算法資料結構
- 所謂的演算法,有時候幾十行程式碼就能搞定!演算法行程
- 【資料結構與演算法】字典樹(附完整原始碼)資料結構演算法原始碼
- [資料結構與演算法] 排序演算法資料結構演算法排序
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構