1.代码展示
int majorityElement(int* nums, int numsSize)
{
int flag = -1;
int sum = 0;
for(int i = 0;i < numsSize;i++)
{
if(sum == 0)
{
flag = nums[i];
}
if(nums[i] == flag)
{
sum++;
}
else
{
sum--;
}
}
sum = 0;
int len = numsSize;
for(int i = 0;i < numsSize;i++)
{
if(nums[i] == flag)
{
sum++;
}
}
return sum * 2 > len ? flag : -1;
}
2.思路解析
(借鉴了题解中的思路,大家也可以看题解的视频,更加详细)
1.该题中所用到的是投票法,即将定义一个 flag 来当做存储记号元素的变量,sum充当计数器。
2.即先将首元素拿出来一次与后面数字对比,如果相同那么 sum 自增,反之 sum 自减,如果存在主要元素那么投票结束 sum >=1,此时 flag 存储的就是主要元素,当然存在主要元素不存在的情况,所以要有第二次遍历,统计主要元素出现的次数,符合条件则返回 flag,反之返回 -1。
3.至于为什么在第二次遍历之前将 sum 初始化为0,是起清空计数器、存储第二次遍历主要元素出现的次数的作用 。