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

    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.

    Boyer-Moore Majority Vote algorithm

    The essential concepts is you keep a counter for the majority number X. If you find a number Y that is not X, the current counter should deduce 1. The reason is that if there is 5 X and 4 Y, there would be one (5-4) more X than Y. This could be explained as "4 X being paired out by 4 Y".

    And since the requirement is finding the majority for more than ceiling of [n/3], the answer would be less than or equal to two numbers.
    So we can modify the algorithm to maintain two counters for two majorities.

     public List<Integer> majorityElement(int[] nums) {
           List<Integer> list = new ArrayList<>();
           if (nums == null || nums.length == 0) {
               return list;
           }
           if (nums.length == 1) {
               list.add(nums[0]);
               return list;
           }
           int ans1 = 0, ans2 = 0;
           int count1 = 0, count2 = 0;
           for (int i = 0; i < nums.length; i++) {
               if (nums[i] != ans1 && nums[i] != ans2) {
                   if (count1 == 0) {
                       ans1 = nums[i];
                       count1++;
                   } else if (count2 == 0) {
                       ans2 = nums[i];
                       count2++;
                   } else {
                       count1--;
                       count2--;
                   }
               } else if (nums[i] == ans1) {
                   count1++;
               } else {
                   count2++;
               }
           }
           count1 = 0;
           count2 = 0;
           
           for (int i : nums) {
               if (i == ans1) {
                   count1++;
               } else if (i == ans2) {
                   count2++;
               }
           }
           if (count1 > nums.length / 3) {
               list.add(ans1);
           }
           if (count2 > nums.length / 3) {
               list.add(ans2);
           }
           return list;
    }
    

    多个候选人的投票,从0开始计票, 因为每一票都要计算count, follow up 延伸到找K个 这样的数: 

    simple method is to pick all elements one by one. For every picked element, count its occurrences by traversing the array, if count becomes more than n/k, then print the element. Time Complexity of this method would be O(n2).

    A better solution is to use sorting. First, sort all elements using a O(nLogn) algorithm. Once the array is sorted, we can find all required elements in a linear scan of array. So overall time complexity of this method is O(nLogn) + O(n) which is O(nLogn).

    simple method is to pick all elements one by one. For every picked element, count its occurrences by traversing the array, if count becomes more than n/k, then print the element. Time Complexity of this method would be O(n2).

    A better solution is to use sorting. First, sort all elements using a O(nLogn) algorithm. Once the array is sorted, we can find all required elements in a linear scan of array. So overall time complexity of this method is O(nLogn) + O(n) which is O(nLogn).

      

  • 相关阅读:
    MySQL的数据库时间与电脑系统时间不一致
    csv文件处理——Opencsv
    java中的注解大全@controller、@service、@repository等
    浅谈HTTP中Get、Post、Put与Delete的区别
    plsql导入.dmp步骤
    解决maven官方库中没有oracle jdbc驱动的问题:Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0
    String的拼接
    使用java中汇编指令解析String对象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)
    集合 List ,Set
    关于==和equals的区别和联系,面试这么回答就可以
  • 原文地址:https://www.cnblogs.com/apanda009/p/7297492.html
Copyright © 2011-2022 走看看