lintcode--46. 主元素

描述

给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一。

注意事项

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

代码

注意到这么一个事实,主元素出现的次数减去其他所有元素出现的次数总是大于0的,那么我们删除任意两个不同的元素,剩余的数组的主元素依然是整个数组的主元素。代码实现的话肯定不是真的删除,合适的时候更新字数组的位置。我也是看了一会才看懂。
我们先假定第一个数nums[0]为主元素,这个数和其他数出现的次数之差记作dif,初始化为1,从第二个数开始遍历,如果和当前主元素相同,那么dif++,否则dif–,若dif为0的话就更新主元素这个时候前面肯定是偶数个数而且没两个数都是不相同的,所有这样进行遍历之后是可找到主元素的。考虑两种特殊情况,就是都删除倒最后:
如果是奇数个数,那么如果只剩下一个,那么这个数肯定是主元素。
如果是偶数个数,那么剩下两个的话,那么这两个数肯定是一样的,且为主元素,要不就不存在主元素了。

public class Solution {
    /*
     * @param nums: a list of integers
     * @return: find a  majority number
     */
    public int majorityNumber(List<Integer> nums) {
        // write your code here
        int length=nums.size(),result=0,count=1;
        if(length>0){
            result=nums.get(0);count=1;
            for(int i=1;i<length;i++){
                if(nums.get(i)==result){
                    count++;
                }else{
                    count--;
                    if(count==0){
                        result=nums.get(i);
                        count=1;
                    }
                }
            }
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值