Leetcode-169:求众数
题目描述:
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
思路:
- Map存每个数出现次数,大于n/2即为众数
- Moore voting alogrithm:每次从数组中找出一对不同的元素,将它们从数组中删除,直到遍历完整个数组。由于这道题已经说明一定存在一个出现次数超过一半的元素,所以遍历完数组后数组中一定会存在至少一个元素。
- 分治法,不断把数组分成左右两个数组,分别求两个数组的众数,如果相等则返回此数,如果不等则返回两个数组合并后的真正的众数。
class Solution {
public int majorityElement(int[] nums) {
return find(nums,0,nums.length-1);
}
public static int find(int[] nums, int begin, int end){
if (begin == end)
return nums[begin];
else {
int mid = (begin+end)/2;
int left = find(nums,begin,mid);
int right = find(nums,mid+1,end);
if(left == right)//左右两部分的众数相同 则这个数是这部分的众数
return left;
else{//左右两部分的众数不相同 则这两个数都有可能是这部分的众数
//那么遍历这个数组 看一下哪个数字的出现频率高
int countLeft = 0;
int countRight = 0;
for (int i = begin; i <= end; i++)
if(nums[i] == left)
countLeft++;
else if (nums[i] == right)
countRight++;
if(countLeft>countRight)
return left;
else
return right;
}
}
}
}