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