主元素
给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。
注意事项
You may assume that the array is non-empty and the majority number always exist in the array.
样例
给出数组[1,1,1,1,2,2,2],返回 1
分析:这道题看到一种好方法,时间复杂度为O(n),空间复杂度为O(1),主要思想为抵消,一旦发现数组中存在两个不同的数,就都删除,直到剩下的数都一样。此时剩下的数就是主元素。因为每次抵消操作之后,剩下来的数种,主元素一定也还是超过一半的。具体实现的时候,记录一个candidate和其出现的次数count,遍历每个数,如果count==0,则把candidate置为遍历到的数,否则看遍历到的数和candidate是否相等,如果相等,则count++,否则count--(抵消),遍历结束后,candidate就是主元素。
class Solution {
public:
/*
* @param nums: a list of integers
* @return: find a majority number
*/
int majorityNumber(vector<int> &nums) {
// write your code here
int can=0,num=-1;
int i=0;
while(i<nums.size()-1)
{
if(num<0)//选取当前元素
{
can=nums[i];
num++;//次数加1
}
if(can==nums[i+1])//相等则次数加一,跳到下下个
{ num++;
i+=2;
}
else
{
num--;
i+=2;
}
}
return can;
}
};
下面的这种简洁一些
class Solution {
public:
/*
* @param nums: a list of integers
* @return: find a majority number
*/
int majorityNumber(vector<int> &nums) {
// write your code here
int can=0,num=0;
for(int i=0;i<nums.size();i++)//这里看到别人用for(auto num:nums)的循环
{
if(num==0)//主元素次数为0,定义当前元素为主元素
{
can=nums[i];
num++;
}
else if(nums[i]==can)//主元素与当前相等,次数加加
num++;
else//否则减减
num--;
}
return can;
}
};