169 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.
方法1排序后双指针
int majorityElement(vector<int>& nums)
{
int n = nums.size();
sort(nums.begin(),nums.end());
int p1 = 0, p2 = n / 2 - (1 - n % 2);
while (p2<n)
{
if (nums[p1] == nums[p2])
return nums[p1];
p1++;
p2++;
}
return nums[0];
}
其实,nums已排序为前提,细想就可以得出以下结论(假设结果为res),
1,如果n为偶数,要么res是前半段,要么是后半段,要么跨越中间
2,如果n为奇数,要么res是前半段,要么是后半段,要么跨越中间。不论哪一段肯定包含中间的数
int majorityElement(vector<int>& nums)
{
int n = nums.size();
sort(nums.begin(),nums.end());
int p = n / 2;
if (n % 2 == 0)
{
if (nums[0] == nums[p-1])
return nums[0];
return nums[p];
}
else
{
return nums[p];
}
}
简化后
int majorityElement(vector<int>& nums)
{
int n = nums.size();
sort(nums.begin(),nums.end());
int p = n / 2;
if (n % 2 == 0&& nums[0] == nums[p - 1])
return nums[0];
return nums[p];
}
下面的代码也能通过测试,但是实际是不对的,当输入是1 1 2 3就不对
int majorityElement(vector<int>& nums)
{
sort(nums.begin(),nums.end());
return nums[nums.size()/2];
}
Boyer-Moore最大投票算法 参考https://segmentfault.com/a/1190000004905350
int majorityElement(vector<int>& nums)
{
int n = nums.size();
int major = nums[0], count = 1;
for (int i = 1; i<n; i++)
{
if (count == 0)
{
count++;
major = nums[i];
}
else if (major == nums[i])
count++;
else
count--;
}
return major;
}
229 https://leetcode.com/problems/majority-element-ii/
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
vector<int> majorityElement(vector<int>& nums)
{
int n = nums.size();
int num1 = 0, num2 = 0, n1 = 0, n2 = 0;
for (int num:nums)
{
if (num == num1)
n1++;
else if (num == num2)
n2++;
else if (n1 == 0)
{
n1++;
num1 = num;
}
else if (n2 == 0)
{
n2++;
num2 = num;
}
else
{
n1--;
n2--;
}
}
n1 = n2 = 0;
for (int num : nums)
{
if (num == num1)
n1++;
else if (num == num2)
n2++;
}
vector<int> res;
if (n1 > n / 3)
res.push_back(num1);
if (n2 > n / 3)
res.push_back(num2);
return res;
}
参考
https://segmentfault.com/a/1190000004905350
https://leetcode.com/discuss/42806/boyer-moore-majority-vote-algorithm-generalization