169. Majority Element*
https://leetcode.com/problems/majority-element/
题目描述
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
解题思路
此题也出现在 剑指 Offer – 数组中出现次数超过一半的数字(二十八) 中. 此题用投票法来求解. 由于数组中肯定存在大于 ⌊ n/2 ⌋
个数的元素, 那么设置候选 candiate
以及对应的票数 votes
, 依次访问数组中的每个元素, 如果它和 candidate
相等, 那么就让票数 votes += 1
, 否则就 votes -= 1
. 如果某个候选的票数刚好为 0
, 那么就更换候选人. 经过上面的操作, 最终剩下的候选肯定是出现次数最多的那个元素.
C++ 实现 1
投票法. 时间复杂度为 O ( N ) O(N) O(N).
class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate = nums[0], votes = 1;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] == candidate)
votes += 1;
else {
votes -= 1;
if (votes == 0) {
candidate = nums[i];
votes = 1;
}
}
}
return candidate;
}
};
C++ 实现 2
更为简洁的写法.
class Solution {
public:
int majorityElement(vector<int>& nums) {
int vote = 0, count = 0;
for (int i = 0; i < nums.size(); ++i) {
if (count == 0) vote = nums[i];
count += (vote == nums[i]) ? 1 : -1;
}
return vote;
}
};