• LintCode-Majority Number III


    Given an array of integers and a number k, the majority number is the number that occurs more than 1/k of the size of the array. Find it.

    Note

    There is only one majority number in the array.

    Example

    For [3,1,2,3,2,3,3,4,4,4] and k = 3, return 3

    Challenge

    O(n) time and O(k) extra space

    Analysis:

    Keep k-1 pointers and counters. Use HashMap to store numbers and counters, every delete operation will cost k-1, however, the max times of deletion is n/(k-1) because deletion only happens when there are (k-1) numbers in the map. So the overall complexity is still O(n).

    Solution:

     1 public class Solution {
     2     /**
     3      * @param nums: A list of integers
     4      * @param k: As described
     5      * @return: The majority number
     6      */
     7     public int majorityNumber(ArrayList<Integer> nums, int k) {
     8         if (nums==null || nums.size()==0) return 0;
     9 
    10         int len = nums.size();
    11         Map<Integer,Integer> nMap = new HashMap<Integer,Integer>();
    12         nMap.put(nums.get(0),1);
    13         for (int i=1;i<len;i++)
    14             if (nMap.containsKey(nums.get(i))){
    15                 int val = nMap.get(nums.get(i))+1;
    16                 if (val==0) nMap.remove(nums.get(i));    
    17                 else nMap.put(nums.get(i),val);
    18             } else {
    19                 //if the number of existing numbers is less than k-1, then just add one.
    20                 if (nMap.size()<k-1){
    21                     nMap.put(nums.get(i),1);
    22                 } else {
    23                     List<Integer> keyList = new ArrayList<Integer>();
    24                     //decrease the value of every key by 1.
    25                     for (Map.Entry en : nMap.entrySet()){
    26                         int key = (int) en.getKey();
    27                         int value = (int) en.getValue();
    28                         value--;
    29                         if (value==0) keyList.add(key);
    30                         nMap.put(key,value);
    31                     }
    32                     for (int key : keyList) nMap.remove(key);
    33                 }
    34             }
    35 
    36         for (Map.Entry en: nMap.entrySet()) en.setValue(0);
    37         int num = 0, count = 0;
    38         for (int i=0;i<len;i++)
    39             if (nMap.containsKey(nums.get(i))){
    40                 int val = nMap.get(nums.get(i))+1;
    41                 if (val>count){
    42                     num = nums.get(i);
    43                     count = val;
    44                 }
    45                 nMap.put(nums.get(i),val);
    46             }        
    47         return num;
    48 
    49     }
    50 }

    NOTE: It is a very good problem to practice HashMap and its iteration.

  • 相关阅读:
    处理i18n国际电话区号的代码实践
    iOS 万能跳转界面方法 (runtime实用篇一)
    URI跳转方式地图导航的代码实践
    iOS @IBDesignable和@IBInspectable
    我的iOS高效编程秘诀—坚持编程习惯
    如何手动解析CrashLog
    小心别让圆角成了你列表的帧数杀手
    iOS开发之使用Runtime给Model类赋值
    POP介绍与使用实践(快速上手动画)
    NSString&NSMutableString常用操作梳理
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4189468.html
Copyright © 2020-2023  润新知