Majority Element
来自 <https://leetcode.com/problems/majority-element/>
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.
题目解读:
给一个长度为n的数组,找出最主要元素。最主要元素是指改元素在数组中出现的此时多余⌊ n/2 ⌋次。假设数组不为空并且数组中一定存在最主要元素。
解析:
解法一:对数组中的元素由大到小或由小到大进行排序,返回位置⌊ n/2 ⌋的元素就是最主要元素。
解法二:
Moore's voting algorithm算法
算法的基本思想是每次找出一对不同的元素,重数组中删掉,直到数组为空或只有一种元素。不难证明,如果存在元素e出现频率超过半数,那么数组中最后剩下的就只有e。
在遍历开始之前,记最主要的元素majority为空。其出现的此时count=0,
然后遍历数组nums时,如果count=0,表示当前没有候选元素,也就是说之前便利过程中没有找到超过半数的元素,那么如果超过半数的元素majority存在,那么剩下的子数组中,出现次数也一定超过半数。因此我们可以将院士问题转化为其它的子问题,此时majority为当前元素,同时count=1.
如果当前元素nums[i]==majority,那么count++.(没有找到不同元素,只需要把相同的元素累计起来)。
如果当前元素nums[i]!=majority,那么count--.(相当于删除一个majority)
如果遍历结束后,count不为0,那么元素majority即为要寻找的元素。
解法三:
用Map进行实现,将数组元素作为key,将该元素出现的次数作为key所对应的value值。Map初始化为空,当遇见一个新的数组元素时,先直接将该元素作为key值存放到Map中,其对应的value值为1.下次再遇见该元素,则直接将value值加1即可。数组遍历结束后,取出value大于⌊ n/2 ⌋所对应的key值就是要寻找的最主要的元素。
解法四:
这个方法是看了Solution之后才知道的,这里假设数据值范围为(1,2^32-1),那么我们需要一个32个元素的list,初始值都为0。这里的32表示元素转换成二进制之后的32位数。对于每一位数,遍历数据list里的所有数,记录该位为1的个数。如果个数>=len(num)/2+1,则该位为1,否则为0。同理算出每一位,再转换成10进制数即为出现次数最多的数
来自 <http://www.tuicool.com/articles/EFbAnqa>
解法一代码:
public int majorityElement(int[] nums) { if(null == nums) return 0; Arrays.sort(nums); return nums[nums.length/2]; }
解法一性能:
解法二代码:
public int majorityElement(int[] nums) { if(nums == null) return 0; int count = 0; int majority=0; for(int i=0; i<nums.length; i++) { if(0 == count) { majority = nums[i]; count = 1; } else if(majority == nums[i]) { count++; } else { count --; } } return majority; }
解法二性能:
解法三代码:
public int majorityElement(int[] nums) { HashMap<Integer, Integer> count = new HashMap<Integer, Integer>(); for(int a: nums) { if (count.containsKey(a)) { count.put(a, count.get(a)+1); } else { count.put(a, 1); } } for(int item : count.keySet()) { if(count.get(item) > (nums.length/2)) { return item; } } return 0; }
解法三性能:
解法四代码:
解法四代码: public int majorityElement(int[] nums) { if (nums == null || nums.length == 0) return 0; int[] dig = new int[32]; for (int i = 0; i < nums.length; i++) { int temp = nums[i]; for (int j = 0; j < 32; j++) { dig[j] += temp & 1; temp = temp >> 1; } } int count = nums.length / 2; int res = 0; int temp = 1; for (int i = 0; i < 32; i++) { if (dig[i] > count) res = res | temp; temp = temp << 1; } return res; }
解法四性能: