169. Majority Element

class Solution {
    public int majorityElement(int[] nums) {
       int ret=0;
        for(int i=0;i<32;i++){
            int ones=0,zeros=0;
            for(int j=0;j<nums.length;j++){
                if((nums[j]&(1<<i))!=0){
                    ++ones;
                }
                else
                    ++zeros;
            }
            if(ones>zeros)
                ret=ret|(1<<i);
        }
        return ret;
}

}


用位操作数解题 ,因为一个整数在32位机器上可以被表示为长度为32位的数组 输入该数组以计算该整数有0以及1的个数 

((nums[j]&(1<<i))!=0) 这个函数 我刚开始不是很理解 后面查了才懂 是nums[j]索引位置的与上i左移1位 意思是看nums索引j位置这个整数位置i是否为1  



method 2 排序

class Solution {
    public int majorityElement(int[] nums) {
       Arrays.sort(nums);
        return nums[nums.length/2];
}
}

先用java类库中自带 的Arrays.sort对数组中排序 有序数组中一半的数字值就是答案


时间复杂度O(n*logn)

空间复杂度O(1)


method 3

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> mymap=new HashMap<>();
        int ret=0;
        for(int num:nums){
            if(!mymap.containsKey(num))
                mymap.put(num,1);
            
        else
            mymap.put(num,mymap.get(num)+1);
        if(mymap.get(num)>nums.length/2){
            ret=num;
        break;
        }
            }
        return ret;
    }
    
}

这个方法是我刚开始就想到的,但是自己从来没有用map做过题 所以连创建map都不会。。也是十分尴尬,也侧面反映出自己coding能力和基础 的不足,要更多更多的打码,

首先用创建一个map 因为map的特性是key只允许一个值出现一次 所以可以用作记录nums的值 然后value用作记录nums出现的次数,并且用java7新增的foreach方法遍历整个数组,同时 如果map中不包含正在遍历 的这个值 就用put加1 在map中放入这个key 否则,则用put再放一次,put的特性是覆盖原来这个key原本的值,不太了解 后面查书才知道,在value值上调用get 调取正在遍历的key num的值  并且把它加1 然后重新放入到map中  

题目中提到有一半的数组元素都是要找的答案 所以 如果num中已经存在大于nums长度一半的值时,把结果赋值给ret 打破循环




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值