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).

      

  • 相关阅读:
    练习
    js简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、函数、函数调用
    样式表、格式布局、流式布局
    表单
    图片热点、网页划区
    JS模拟窗口
    JavaScript 常用功能实现一览(一)
    分页打印控制 摘自于网络:http://www.cnblogs.com/joinger/articles/1807517.html
    我眼中的C#3.0 摘自于网络:http://www.cnblogs.com/joinger/articles/1297237.html
    .net ToString()用法详解与格式说明
  • 原文地址:https://www.cnblogs.com/apanda009/p/7297492.html
Copyright © 2011-2022 走看看