169. Majority Element
Easy
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
Example 1:
Input: [3,2,3]
Output: 3
Example 2:
Input: [2,2,1,1,1,2,2]
Output: 2
题意
给定一个长度为n的数组,求出现次数大于n/2的元素
思路
如果用HashMap可以实现时间复杂度O(n),空间复杂度O(n)的算法。进一步地,使用摩尔投票法可以实现时间复杂度O(n),空间复杂度O(1)的算法。
摩尔投票法使用两个变量cand和cnt分别存储当前有候选元素和候选元素已经出现的次数。遍历数组中的每个元素,当cnt=0时表示之前的各个候选元素都被否决了,因此选取当前元素作为候选元素;cnt>0时,如果当前元素与候选元素cand相等,则++cnt;否则–cnt表示一个非候选元素与候选元素抵消。
由于候选元素出现次数大于等于其他各个元素,因此候选元素在cnt累加和抵消的过程中不会被其他元素取代,最后返回cand就是要找的出现次数大于n/2的元素。
代码
class Solution {
public int majorityElement(int[] nums) {
int cand = 0, cnt = 0;
for (int num: nums) {
if (cnt == 0) {
cand = num;
cnt = 1;
} else if (num != cand) {
--cnt;
} else {
++cnt;
}
}
return cand;
}
}