1. 题解
具体题解可以去看官网上https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/solution/mian-shi-ti-39-shu-zu-zhong-chu-xian-ci-shu-chao-3/
本节主要针对为什么要设第一个元素为众数,最后还能得出正确答案来解释.
2. 代码
// 203. 数组中超过一半的元素
public int majorityElement(int[] nums) {
int x=0;// 设初始众数为0
int votes=0; //初始总票数为0;
for (int num : nums) {
if (votes==0){
x=num;
}
votes+=(x==num ? 1 : -1);
}
return x;
}
3. 法2
// 法二 基于 Partion函数的解法
// 203. 数组中超过一半的元素
public int majorityElement(int[] nums) {
int start=0;
int end=nums.length-1;
int mid=(end-start+1)/2;
int index = partion(nums, start, end);
while (index!=mid){//没找到中间下标的元素
if (index<mid){// 排序后下标为mid的元素在右边
start=index+1;
index=partion(nums,start,end);
continue;
}
if (index>mid){
end=index-1;
index=partion(nums,start,end);
continue;
}
}
return nums[index];
}
/**
* 快排中的partion
* @param arr
* @param start
* @param end
* @return
*/
public int partion(int[] arr,int start,int end){ //
int index;
if(end!=start){
index=getRandomIndex(start,end);
}else{
index=start;
}
int temp=arr[index];// temp存储基准元素
int t=arr[index];
arr[index]=arr[start];
arr[start]=t; //将基准调到第一位;
int small=start; // <= 基准的最大下标
for (int i = start+1; i <=end ; i++) {
if (arr[i]<temp){
t=arr[++small];
arr[small]=arr[i];
arr[i]=t;
}
}
//循环完成,此时small指向最后一个小于等于基准的元素,将第一个与small交换
t=arr[small];
arr[small]=arr[start];
arr[start]=t;
return small;
}
public int getRandomIndex(int start,int end){
Random random = new Random();
return random.nextInt(end-start)+start;
}