這道題如果不考慮空間復雜度和時間復雜度的限制的話很好做,一種思路是通過一次遍歷將所有元素的數量記錄在一個哈希表中,然后我們直接返回出現次數最多的鍵即可。另一種思路是直接對數組進行排序,數組中間的值一定是多數元素,因為該元素超過半數,在有序的狀態下,無論如何都會在數組的中間位置出現,這個也很好想。
但是考慮時間和空間的限制,這道題就很難想了,這道題我是看了華南溜達虎的視頻才做出來的,感覺他對摩爾投票法講解的還不錯,也可以結合K神的題解來看,更加通俗易懂。
我們定義count
和result
,result
代表多數元素,而count
對應多數元素的數量,初始化為0
,我們先假定nums[0]
為多數元素,遍歷整個數組nums
,當nums[i] == result
時,我們將當前多數元素的數量+1
,然后遍歷下一個元素,當nums[i] != result
時,我們就將count
減一,當count
被減為負數時,說明當前認定的多數元素可能不是真正的多數元素,我們將result
賦值為當前的nums[i]
,并將count
賦值為1
(對應當前多數元素的數量)
經歷過一次遍歷后,由于多數的數量超過半數(至少比其他的元素個數之和多1
),無論數組如何排列,最后一定是多數的票數占優,最后result
一定會被賦值為多數。
class Solution {
public:int majorityElement(vector<int>& nums) {int count = 0;int result = nums[0];for(int i = 0; i < nums.size(); i++){if(nums[i] == result)count++;else{count--;if(count < 0){result = nums[i];count = 1;} }}return result;}
};