leetcode_169(主元素查找)

一、题目大意:
给定size 为n的数组,查找出主元素,就是出现次数大于n/2次的元素。你可以假定数组非空,而且主元素一定存在。

二、分析
1,不难想到,出现半数以上的元素最多只有一个。

2,选出出现次数达到半数以上的元素,最笨的方法当然就是对数组中出现的每一个元素,都遍历一遍数组记录下其出现频率,通过与比较确定是否符合要求。这样就可以在的时间内,用O(1)空间解决问题。但是时间复杂度O(n^2),这里不做介绍。

3,hash表来存储每个元素出现的次数,这样就可以得到一个时间复杂度和空间复杂度都是O(n)的解决方案。这里我们不自己构造hash函数,使用java自带的hashMap,时间上也不是很快。

4,随机化方法,每次随机产生一个位置,对这个位置的数进行计数,看是不是主元素,时间O(n)。

5,Moore’s Voting Algorithm算法。时间O(n)
算法的基本思想非常简洁: 每次都找出一对不同的元素,从数组中删掉,直到数组为空或只有一种元素。 不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。当然,最后剩下的元素也可能并没有出现半数以上。比如说数组是[1, 2, 3],最后剩下的3显然只出现了1次,并不到半数。排除这种false positive情况的方法也很简单,只要保存下原始数组,最后扫描一遍验证一下就可以了。

三、java求解
1,hash表:

public static int majorityElement(int[] nums) {
        if(nums.length == 0)
            return -1;
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i=0;i<nums.length;i++) {
            if(map.get(nums[i]) == null) {
                map.put(nums[i], 1);
            }else {
                map.put(nums[i], map.get(nums[i])+1);
            }
        }
        for(Integer key:map.keySet()) {
            if(map.get(key) > nums.length/2)
                return key;
        }
        return -1;
    }

2,随机化方法

public static int majorityElemen2(int[] nums) {
        int count = 0;
        while(true) {
            int n = (int) (Math.random()*(nums.length-1));
            for(int i=0;i<nums.length;i++) {
                if(nums[i] == nums[n]) {
                    count++;
                }
            }
            if(count > nums.length/2) {
                return nums[n];
            }else {
                count = 0;
                continue;
            }
        }
    }

3,算法

public static int majorityElemen3(int[] nums) {
        int elem = 0;
        int count = 0;

        for(int i=0;i<nums.length;i++) {
            if(count == 0) {
                elem = nums[i];
                count = 1;
            }else {
                if(elem == nums[i]) {
                    count++;
                }else {
                    count--;
                }
            }
        }

        return elem;
    }

四、算法的python实现

class Solution(object):
    def majorityElement(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        elem = 0
        count = 0
        for i in nums:
            if count == 0:
                elem = i
                count = 1
            else:
                if elem == i:
                    count += 1
                else:
                    count -=1

        return elem
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值