169. Majority Element

Question

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

思路一

可以把数组中的元素和元素出现的次数存入到hashmap中,然后遍历数组中的元素,然后把再一次出现的元素的次数刷新。

代码
public class Solution {
    public int majorityElement(int[] nums) {
        //用hashmap可以实现,每遍历一次,value值加一
        //忘记考虑只有一个元素的情况
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0;i < nums.length;i++){
            if(map.containsKey(nums[i])){
                int num = map.get(nums[i]);
                map.put(nums[i],num + 1);
                if(num+1 > nums.length/2)
                    return nums[i];
            }
            else
                map.put(nums[i],1);
        }
        return nums[0];
    }
}
结果及分析

【You are here!
Your runtime beats 12.04% of javasubmissions.】这个结果距离最优还差很多。

思路二

用一个标记count记录某个元素出现的次数,如果后面的元素和它相同就加一,有一个元素和他不相同就减一,当count小于等于0时重新记录新的元素。原文

public class Solution {
    public int majorityElement(int[] num) {
        int main = num[0]; // 用于记录主元素,假设第一个是主元素
        int count = 1; // 用于抵消数的个数
        for (int i = 1; i < num.length; i++) {
        // 从第二个元素开始到最后一个元素
            if (main == num[i]) { // 如果两个数相同就不能抵消
                count++; // 用于抵消的数据加1
            } else {
                if (count > 0) { // 如果不相同,并且有可以抵消的数
                    count--; // 进行数据抵消
                } else { // 如果不相同,并且没有可以抵消的数
                    main = num[i]; // 记录最后不可以抵消的数
                }
            }
        }
        return main;
    }
}
结果及分析

【You are here!
Your runtime beats 63.75% of javasubmissions.】
时间复杂度为O(n),空间复杂度为O(1);

二刷解法

解法与前一个解法相同,优化了一些代码的书写方式,最好不要嵌套if,而且更容易理解,当count抵消完的时候,会加入一个新的数字,同时count置为1.

CODE
public class Solution {
    public int majorityElement(int[] nums) {
        int maj = nums[0],count = 1;//用于抵消不同的元素
        for(int i = 1;i < nums.length;i++){
            if(count == 0){
                maj = nums[i];
                count = 1;
            }
            else if(nums[i] == maj)
                count++;
            else
                count--;
        }
        return maj;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值