题目描述
Given an array nums
of size n
, return the majority element.
The majority element is the element that appears more than ⌊n / 2⌋
times. You may assume that the majority element always exists in the array.
Example 1:
Input: nums = [3,2,3] Output: 3
Example 2:
Input: nums = [2,2,1,1,1,2,2] Output: 2
Constraints:
n == nums.length
1 <= n <= 5 * 104
-231 <= nums[i] <= 231 - 1
Follow-up: Could you solve the problem in linear time and in O(1)
space?
解题思路
【C++】
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n=nums.size();
int maj=0,count=1;
for(int i=1;i<n;i++){
if(nums[maj]==nums[i]) count++;
else count--;
if(count==0) {
maj=i;
count=1;
}
}
int c=0;
for(int i=0;i<n;i++) {
if(nums[maj]==nums[i]) c++;
if(c>n/2) return nums[maj];
}
return -1;
}
};
再简洁点
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n = nums.size(), maj = -1, count = 0;
for (auto num : nums) {
if (maj == num) {count++;}
else if (count == 0) {
maj = num;
count = 1;
} else {count--;}
}
count = 0;
for (auto num : nums) {
if(maj == num) count++;
if(count > n / 2) return maj;
}
return -1;
}
};
【Java】
class Solution {
public int majorityElement(int[] nums) {
int count = 1, maj = 0;
for (int i=1; i<nums.length; i++) {
if (nums[maj] == nums[i]) {count++;}
else {count--;}
if (count == 0) {
maj = i;
count = 1;
}
}
count = 0;
for (int i=0; i<nums.length; i++) {
if (nums[i] == nums[maj]) {count++;}
if (count > nums.length/2) {return nums[maj];}
}
return -1;
}
}
参考文献
【1】摩尔投票算法(Boyer-Moore majority vote algorithm)_Iovems的博客-CSDN博客