169 Majority Element 求众数 数组中出现次数超过一半的数字
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且数组中的众数永远存在。
详见:https://leetcode.com/problems/majority-element/description/
Java实现:
方法一:
class Solution { public int majorityElement(int[] nums) { int n=nums.length; if(n==0||nums==null){ return -1; } int num=nums[0]; int cnt=1; for(int val:nums){ if(val==num){ ++cnt; }else{ --cnt; if(cnt==0){ num=val; cnt=1; } } } cnt=0; for(int val:nums){ if(val==num){ ++cnt; } } if(2*cnt>n){ return num; } return -1; } }
方法二:
class Solution { public int majorityElement(int[] nums) { int n=nums.length; if(n==0||nums==null){ return -1; } int low=0; int high=n-1; int mid=n>>1; int index=partition(nums,low,high); while(index!=mid){ if(index>mid){ high=index-1; index=partition(nums,low,high); }else if(index<mid){ low=index+1; index=partition(nums,low,high); } } int num=nums[mid]; int cnt=0; for(int val:nums){ if(val==num){ ++cnt; } } if(2*cnt>n){ return num; } return -1; } private int partition(int[] nums,int low,int high){ int pivot=nums[low]; while(low<high){ while(low<high&&nums[high]>=pivot){ --high; } nums[low]=nums[high]; while(low<high&&nums[low]<=pivot){ ++low; } nums[high]=nums[low]; } nums[low]=pivot; return low; } }
python实现:
参考:http://www.cnblogs.com/grandyang/p/4233501.html