使用场景:在一个数组中找到超过一半的那个元素。
原理:取第一个元素当标志,遍历数组,如果相同+1,不相同-1,如果为负数,舍弃原先的元素,将当前元素变成标志,继续前面的做法。结束之后,再次循环一遍判断标志是否是超过一半的元素。
分析:假设数组里面有一个元素超过一半,假设当前标志不是这个超过一半的元素,那么最终一定会变成负数,切换标志,剩下的元素一定是超过一半的那个元素多,因为抵消了前面的标志,以此类推,最终获取的标志一定是超过一半的元素。
代码:
int majorityElement(vector<int>& nums) {
int num = 0,renums = nums[0];
for(int i=0;i<nums.size();i++){
if(renums == nums[i]) num++;
else {
num--;
if(num < 0){
num = 1; renums = nums[i];
}
}
}
int tempnum = 0;
for(int i=0;i<nums.size();i++){
if(nums[i] == renums) tempnum++;
}
if(tempnum * 2 > nums.size()) return renums;
return -1;
}