经过看别人的证明,我才知道这是一个算法,我昨天晚上刷leetcode时,Majority Element这道题,自己写了个分治算法,但是消耗内存特别大,时间也比较慢,题目是求众数,且保证众数的个数大于总数的一半。
class Solution {
public:
map<int, int> merge_map(map<int, int> &left, map<int, int> &right)
{
map<int, int> var = right;
for (map<int, int>::iterator iter = left.begin(); iter != left.end(); ++iter)
{
auto i = *iter;
var[i.first]+=i.second;
}
return var;
}
map<int, int> Majority_Element(vector<int>::iterator A, int n)
{
if (n == 1) {
map<int, int> a;
a[*A] = 1;
return a;
}
int mi = n / 2;
map<int, int> left = Majority_Element(A, n / 2);
map<int, int> right = Majority_Element(A + n / 2, n - n / 2);
return merge_map(left, right);
}
int find_max(const map<int, int> &res)
{
int num = 0;
int var = 0;
for (map<int, int>::const_iterator iter = res.cbegin(); iter != res.cend(); ++iter)
{
pair<int, int> curr = *iter;
if (curr.second > num) {
var = curr.first;
num = curr.second;
}
}
return var;
}
int majorityElement(vector<int>& nums) {
map<int, int> result = Majority_Element(nums.begin(), nums.size());
return find_max(result);
}
};
上面是我的解法,其时间复杂度为T(N)=T(N/2)+T(N-N/2)+O(N/2)
在网上一搜,其实这是一个摩尔投票算法:
因为题目要求众数的个数大于一半,因此,每当有一对不同的数出现,我就互相抵消,删除,那么剩下的数必是最大的数。
因此我只需遍历一遍,且时间复杂度在O(n),空间复杂度为O(1)
class Solution {
public:
int majorityElement(vector<int>& nums) {
int result= 0,count= 0;
for(int num:nums){
if(count== 0) {result= num;++count;}
else (num == result) ? ++count: --count;
}
return result;
}
};