您的位置:首页 > 其它

寻找多数元素

2017-04-23 11:38 134 查看
在原序列中去除两个不同的元素后,那么在原序列中的多数元素在新序列中还是多数元素

算法基本思路:

(1)在寻找多数元素的过程中,将计数器置1,遇到相同元素则计数器加1,遇到不同元素则计数器减1,一直到计数器等于0或遍历完整个序列。由此可见,计数器的值表示当前元素抵消掉不同元素后的出现次数;

(2)当计数器在遍历完整个序列前就已经是0,则忽略掉已经遍历过的元素(可以看作两两抵消不影响序列中的多数元素),跳到下一个元素然后计数器重新置1,重复上述步骤,一直到遍历完整个元素;

(3)当遍历完整个序列后,算法会返回一个值,此时我们还需要检测一次这个值是否真的是多数元素,即遍历统计一次。这一步不可或缺。因为上述两个步骤到了遍历完序列后必将返回一个值,无论序列有无多数元素。此值存在三种情况,第一,它真的是多数元素;第二,它只是序列后面的某个元素刚好抵消完序列;第三,两者皆是。我们必须检测一次。

查看原文(*^__^*) 嘻嘻……

主要概念是为多数X保留计数器。如果找到不是X的数字Y,则当前计数器应该推导出1,原因是如果存在5 X和4 Y,则会有一个 5-4)X比Y更多。这可以解释为“4 X配对由4 Y”。
int Majority2(vector<int> num) {
int cnt=0,a=0;
for(int i=0;i<num.size();i++) {
if(a == num[i]) cnt++;
else if(cnt==0) {
a = num[i];
cnt=1;
}
else cnt--;
}
int count=0;
for(int i=0;i<num.size();i++) {
if(a == num[i]) {
count++;
}
}
if(count>num.size()/2) return a;
else return -1;
}

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) {
vector<int> res;
int cnt1=0,cnt2=0,a=0,b=1;
for(int i=0;i<nums.size();i++) {
if(a == nums[i]){
cnt1++;
}
else if(b == nums[i]){
cnt2++;
}
else if(cnt1 == 0){
a=nums[i];
cnt1=1;
}
else if(cnt2 == 0){
b=nums[i];
cnt2=1;
}
else {
cnt1--;
cnt2--;
}
}
cnt1=0;
cnt2=0;
for(int i=0;i<nums.size();i++) {
if(nums[i]==a) cnt1++;
if(nums[i]==b) cnt2++;
}
if(cnt1>nums.size()/3) res.push_back(a);
if(cnt2>nums.size()/3) res.push_back(b);
return res;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: