题目
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
题解
解法一:摩尔投票法
public int majorityElement(int[] nums) {
int target = nums[0];
int count =1;
for (int i = 0; i < nums.length; i++) {
if (nums[i]==target){
count++;
}else {
count--;
}
if (count==0){//说明,有相同数量的与target不同的元素和前面的所有target全部抵消
target = nums[i];//将target更新为最后一个与target不同的元素
count =1;//并重新开始计数
}
}
return target;
}
解法二:快速排序
class Solution {
public int majorityElement(int[] nums) {
qSort(nums,0,nums.length-1);
return nums[nums.length/2];
}
public static void qSort(int[] nums,int l,int r){
if (l>=r){
return ;
}
int pivot=nums[l];//将最左边的元素作为枢轴
int i=l,j=r; //i,j指针分别从前从后遍历数组指定范围
while (i<j){
while (i<j&&nums[j]>pivot) j--;//从后往前找到一个<=pivot的元素
while (i<j&&nums[i]<=pivot) i++;//从前往后找到一个>pivot的元素
if (i<j){//交换nums[i]和nums[j]
int temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
}
//
//将nums[l]赋值为nums[i],作为下一次递归时的枢轴
nums[l] = nums[i];
//将枢轴放在该放的位置
nums[i] = pivot;
//此时nums[i]右边的元素都比nums[i]大
// nums[i]左边的元素都比nums[i]小
qSort(nums,l,i-1); //递归处理左区间
qSort(nums,i+1,r); //递归处理右区间
}
}