这道题如果不考虑空间复杂度和时间复杂度的限制的话很好做,一种思路是通过一次遍历将所有元素的数量记录在一个哈希表中,然后我们直接返回出现次数最多的键即可。另一种思路是直接对数组进行排序,数组中间的值一定是多数元素,因为该元素超过半数,在有序的状态下,无论如何都会在数组的中间位置出现,这个也很好想。
但是考虑时间和空间的限制,这道题就很难想了,这道题我是看了华南溜达虎的视频才做出来的,感觉他对摩尔投票法讲解的还不错,也可以结合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;}
};