[LeetCode]Majority Element

来源:互联网 发布:网络平台借贷违法的吗 编辑:程序博客网 时间:2024/06/01 09:46

题目描述:

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.

题目大意:

给定一个长度为n的数组,寻找其中的“众数”。众数是指出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的并且数组中的众数永远存在。

我的第一想法是建一个map保存每个元素出现的次数,时间复杂0(n), 空间复杂度0(n)。代码如下:

import java.util.Map;import java.util.HashMap;public class Main {    public static void main(String args[]) {        System.out.println(solution(new int[] {            1, 1, 2, 2, 3, 1        }));    }    private static int solution(int[] num) {        if(num == null || num.length == 0) {            return -1;        }        Map<Integer, Integer> map = new HashMap<>();        for(int elem : num) {            //map包含元素则在原来的value上加1,否则value为1            map.put(elem, map.get(elem) == null ? 1 : map.get(elem) + 1);        }        int result = num[0];        int maxTimes = 0;        //遍历map找出出现次数最多的元素        for(int elem: map.keySet()) {            if(map.get(elem) > maxTimes) {                maxTimes = map.get(elem);                result = elem;            }        }        return result;    }}

总觉得自己这个方法空间复杂度过高,网上看到了一种空间复杂度为0(1)的算法。链接

解题思路:

“投票算法”,设定两个变量candidate和count。candidate保存当前可能的候选众数,count保存该候选众数的出现次数。

遍历数组num。

如果当前的数字e与候选众数candidate相同,则将计数count + 1

否则,如果当前的候选众数candidate为空,或者count为0,则将候选众数candidate的值置为e,并将计数count置为1。

否则,将计数count - 1

最终留下的候选众数candidate即为最终答案。

以上算法时间复杂度为O(n),空间复杂度为O(1)

实现代码如下:

    private static int solution2(int[] num) {        int result=num[0];        int len = num.length;        int count = 0;        for (int i=0;i<len;i++){            if (count==0||result==num[i]) {                result = num[i];                count++;            }   //count清零时,取当前数作为result            else count--;        }        return result;    }
  • 但是我想要说明的是,这个算法是有bug的,不信你试试输入1,1,2,2,3,1,结果是输出3的,仔细想想就知道错在哪了。
  • 几分钟后,我想明白了,题目有说明,众数出现的次数大于n/2,那1,1,2,2,3,1不满足要求,所以这个算法是没有问题的,啊哈哈哈哈
1 0