标签:
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
Solution 1:
比较naive的想法,遍历数组,用map存数和对应的个数。然后再遍历keyset读出那个次数大于n/2的数。
map用来处理重复个数,和记录相同key不同value变化很有用。
注意
int change=res.get(nums[i])+1;
res.put(nums[i],change);
如果直接res.put(nums[i],res.get(nums[i])++)会出错。并不知道具体原因,个人觉得是不能读value的同时还改变value的值。
public class Solution { public int majorityElement(int[] nums) { Map<Integer,Integer> res=new HashMap<Integer,Integer>(); int majority=0; for(int i=0;i<nums.length;i++) { if(!res.containsKey(nums[i])) { res.put(nums[i],1); } else { int change=res.get(nums[i])+1; res.put(nums[i],change); } } for(int num:res.keySet()) { if(res.get(num)>(nums.length/2)) { majority=num; } } return majority; } }
看了discussion的解法,觉得自己的太naive了= =
Solution 2:
public int majorityElement2(int[] nums) { Map<Integer, Integer> myMap = new HashMap<Integer, Integer>(); //Hashtable<Integer, Integer> myMap = new Hashtable<Integer, Integer>(); int ret=0; for (int num: nums) { if (!myMap.containsKey(num)) myMap.put(num, 1); else myMap.put(num, myMap.get(num)+1); if (myMap.get(num)>nums.length/2) { ret = num; break; } } return ret; }
不需要再用iterator检查keyset,在记录数和次数的同时就可以比较与n/2的大小。
Solution3:
public int majorityElement1(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; }
这尼玛简直是作弊啊!!
Solution4:
Boyer-Moore Majority vote algorithm
https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm
核心思想就是存一个counter对应canadiate,如果真的有一个choice次数大于一半,那当循环结束的时候counter必然对应majority choice。
public int majorityElement3(int[] nums) { int count=0, ret = 0; for (int num: nums) { if (count==0) ret = num; if (num!=ret) count--; else count++; } return ret; }
因为题目已经说了肯定存在,所以不用再检查是不是大于一半,退出循环的counter肯定对应着majority 。
标签:
原文地址:http://www.cnblogs.com/Machelsky/p/5858751.html