题目:如果数组中多一半的数都是同一个,则称之为主要元素。给定一个整数数组,找到它的主要元素。若没有,返回-1。
实现想法
既然主要元素数大于length/2,那假设每个主要元素可以抵消掉一个非主要元素,最后剩下的一定是主要元素。因为数组中元素是乱序,存在非主要元素互相抵消的情况,该情况下,剩下的一样是主要元素。用count记录目前为止的主要元素数,t进行存储。
代码
// Java
class Solution {
public int majorityElement(int[] nums) {
int count=0,t=0;
for(int i=0;i<nums.length;i++)
{
if(count==0)
{
t=nums[i];count++;continue;
}
if(t==nums[i]) count++;
else count--;
}
if(count==0) return -1;
else return t;
}
}
上述算法基于主要元素存在的情况下,题目要求不存在时返回-1,故需添加验证当前t是否为主要元素。
下面为完整代码
// java
class Solution {
public int majorityElement(int[] nums) {
int count=0,t=0;
for(int i=0;i<nums.length;i++)
{
if(count==0){t=nums[i];count++;continue;}
if(t==nums[i]) count++;
else count--;
}
if(count==0) t=-1;
else for(int num:nums)
{
count=0;
if(num==t)
count++;
if(count<nums.length/2+1)
t=-1;
}
return t;
}
}