zoukankan      html  css  js  c++  java
  • leetcode 229: Majority Element II

    Majority Element II

    Total Accepted: 3172 Total Submissions: 14746

    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.


    [思路]

    [REFERENCE] http://bookshadow.com/weblog/2015/06/29/leetcode-majority-element-ii/

    观察可知。数组中至多可能会有2个出现次数超过 ⌊ n/3 ⌋ 的众数

    记变量n1, n2为候选众数; c1, c2为它们相应的出现次数

    遍历数组。记当前数字为num

    若num与n1或n2同样,则将其相应的出现次数加1

    否则,若c1或c2为0。则将其置为1。相应的候选众数置为num

    否则,将c1与c2分别减1

    最后,再统计一次候选众数在数组中出现的次数,若满足要求,则返回之。


    [CODE]

    public class Solution {
        public List<Integer> majorityElement(int[] nums) {
            // 1, 2
            List<Integer> res = new ArrayList<>();
            if(nums==null || nums.length==0) return res;
            if(nums.length==1) {
                res.add(nums[0]);
                return res;
            }
            
            int m1 = nums[0];
            int m2 = 0;
            
            int c1 = 1;
            int c2 = 0;
            
            for(int i=1; i<nums.length; i++) {
                int x = nums[i];
                if(x==m1) ++c1;
                else if(x==m2) ++c2;
                else if(c1==0) {
                    m1 = x;
                    c1 = 1;
                } else if(c2==0) {
                    m2 = x;
                    c2 = 1;
                } else {
                    --c1; --c2;
                }
            }
            c1 = 0; c2 = 0;
            for(int i=0; i<nums.length; i++) {
                if(m1 == nums[i]) ++c1;
                else if(m2 == nums[i]) ++c2;
            }
            if(c1>nums.length/3) res.add(m1);
            if(c2>nums.length/3) res.add(m2);
            return res;
        }
    }


  • 相关阅读:
    PAT 00-自测1. 打印沙漏(20)
    js Ajax
    c语言算法实现
    解决python for vs在vs中无法使用中文
    python排序算法实现:
    2014-4-27 心情
    Sdut 2416 Fruit Ninja II(山东省第三届ACM省赛 J 题)(解析几何)
    Poj 1061 青蛙的约会(扩展欧几里得)
    hrbust 1328 相等的最小公倍数(数论)
    hdu 1286 找新朋友 (欧拉函数)
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/7201455.html
Copyright © 2011-2022 走看看