• 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.
    
    Have you met this question in a real interview? Yes
    Example
    Given [3,1,2,3,2,3,3,4,4,4] and k=3, return 3.
    
    Note
    There is only one majority number in the array.
    
    Challenge
    O(n) time and O(k) extra space

    这道题跟Lintcode: Majority Number II思路很像,那个找大于1/3的,最多有两个candidate,这个一样,找大于1/k的,最多有k-1个candidate

    维护k-1个candidate 在map里面,key为数字值,value为出现次数。先找到这k-1个candidate后,扫描所有元素,如果该元素存在在map里面,update map;如果不存在,1: 如果map里面有值为count= 0,那么删除掉这个元素,加入新元素;2:map里面没有0出现,那么就每个元素的count--

    注意:有可能map里有多个元素count都变成了0,只用删掉一个就好了。因为还有0存在,所以下一次再需要添加新元素的时候不会执行所有元素count-1, 而是会用新元素替代那个为0的元素

    这道题因为要用map的value寻找key,所以还可以用map.entrySet(), return Map.Entry type, 可以调用getKey() 和 getValue()

    public class Solution {
        /**
         * @param nums: A list of integers
         * @param k: As described
         * @return: The majority number
         */
        public int majorityNumber(ArrayList<Integer> nums, int k) {
            // write your code
            if (nums==null || nums.size()==0 || k<=0) return Integer.MIN_VALUE;
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            int i = 0;
            for (; i<nums.size(); i++) {
                int key = nums.get(i);
                if (map.containsKey(key)) {
                    map.put(key, map.get(key)+1);
                }
                else {
                    map.put(key, 1);
                    if (map.size() >= k) break;
                }
            }
            while (i < nums.size()) {
                int key = nums.get(i);
                if (map.containsKey(key)) {
                    map.put(key, map.get(key)+1);
                }
                else {
                    if (map.values().contains(0)) { //map contains value 0
                        map.put(key, 1); // add new element to map
                        //delete key that has value 0
                        int zeroKey = 0;
                        for (int entry : map.keySet()) {
                            if (map.get(entry) == 0) {
                                zeroKey = entry;
                                break;
                            }
                        }
                        map.remove(zeroKey);
                    }
                    else {
                        for (int nonzeroKey : map.keySet()) {
                            map.put(nonzeroKey, map.get(nonzeroKey)-1);
                        }
                    }
                }
                i++;
            }
            
            HashMap<Integer, Integer> newmap = new HashMap<Integer, Integer>();
            int max = 0;
            int major = 0;
            for (int j=0; j<nums.size(); j++) {
                int cur = nums.get(j);
                if (!map.containsKey(cur)) continue;
                if (newmap.containsKey(cur)) {
                    newmap.put(cur, newmap.get(cur)+1);
                }
                else {
                    newmap.put(cur, 1);
                }
                if (newmap.get(cur) > max) {
                    major = cur;
                    max = newmap.get(cur);   
                }
            }
            return major;
        }
    }
    

      

     if (map.values().contains(0)) 
  • 相关阅读:
    自定义组件要加@click方法
    绑定样式
    647. Palindromic Substrings
    215. Kth Largest Element in an Array
    448. Find All Numbers Disappeared in an Array
    287. Find the Duplicate Number
    283. Move Zeroes
    234. Palindrome Linked List
    202. Happy Number
    217. Contains Duplicate
  • 原文地址:https://www.cnblogs.com/apanda009/p/7791310.html
Copyright © 2020-2023  润新知