美文网首页
229. Majority Element II

229. Majority Element II

作者: yxwithu | 来源:发表于2017-08-28 18:10 被阅读0次

题目

Given an integer array of size n, 
find all elements that appear more than ⌊ n/3 ⌋ times. 
The algorithm should run in linear time and in O(1) space.

题目很简短,给定一个包含n个数字的数组,找出所有出现次数超过 ⌊ n/3 ⌋ 次的数。要求O(n)时间复杂度和O(1)空间复杂度。

解析

  1. 因为要求超过 ⌊ n/3 ⌋ 次,所以最多只有两个数
  2. 可以参考找出出现次数大于一半容量的数的解法:majority-vote-algorithm
  3. 根据以上两点,可以设两个变量,两个计数变量,利用投票算法,得到最后的候选数,为什么是候选数呢,因为数组并未保证一定有这种数和数量。所以还需要再一次遍历检查候选数是否符合要求。

复杂度分析

两次遍历数组,时间复杂度为O(n),空间复杂度为O(1)

代码

public List<Integer> majorityElement(int[] nums) {
    List<Integer> res = new ArrayList();
    if(nums == null || nums.length == 0) return res;
    int candidate1 = 0, candicate2 = 1; //随便赋值就可以
    int cnt1 = 0, cnt2 = 0;
    for(int num : nums){
        if(num == candidate1){
            cnt1 ++;
        }else if(num == candicate2){
            cnt2 ++;
        }else if(cnt1 == 0){
            cnt1 ++;
            candidate1 = num;
        }else if(cnt2 == 0){
            cnt2 ++;
            candicate2 = num;
        }else{
            cnt1 --;
            cnt2 --;
        }
    }
    cnt1 = cnt2 = 0;
    for(int num: nums){
        if(num == candidate1){
            cnt1 ++;
        }else if(num == candicate2){
            cnt2 ++;
        }
    }
    if(cnt1 > nums.length / 3){
        res.add(candidate1);
    }
    if(cnt2 > nums.length / 3){
        res.add(candicate2);
    }
    return res;
}

相关文章

  • II Boyer-Moore Majority Vote Alg

    229. Majority Element II Given an integer array of size n...

  • 229. Majority Element II

    先排序 然后顺序扫描,需要注意边缘,代码如下: 但是这道题目限制了时间是限行时间空间是o(1),因此,既不能使用排...

  • 229. Majority Element II

    Given an integer array of size n, find all elements that ...

  • 229. Majority Element II

    题目 题目很简短,给定一个包含n个数字的数组,找出所有出现次数超过 ⌊ n/3 ⌋ 次的数。要求O(n)时间复杂度...

  • 229. Majority Element II

    思路就是三个三个删,如何描述是三个三个删的关键是两个count要描述好。之前没仔细写,count应该有四种case...

  • 229. Majority Element II

    Question Given an integer array of size n, find all eleme...

  • 229. Majority Element II

    https://leetcode.com/problems/majority-element-ii/ 给定一个数组...

  • 229. Majority Element II

    给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 摩尔投票法 大于 n/3 的数最...

  • 229. Majority Element II (M)

    Given an integer array of size n, find all elements that ...

  • Majority Element II

    Majority Element II 今天是一到有关数学计算的题目,是Majority Element(回复01...

网友评论

      本文标题:229. Majority Element II

      本文链接:https://www.haomeiwen.com/subject/yubgdxtx.html