给定一个大小为 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;
}
}