给定一个大小为?n
?的数组?nums
?,返回其中的多数元素。多数元素是指在数组中出现次数?大于?
? n/2 ?
?的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例?1:
输入:nums = [3,2,3] 输出:3
示例?2:
输入:nums = [2,2,1,1,1,2,2] 输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
方法一:
public static int majorityElement(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
int length = nums.length / 2;
Integer result = 0;
Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
for (Map.Entry<Integer, Integer> entry : entries) {
if (entry.getValue() > length){
result = entry.getKey();
}
}
return result;
}
方法2:? 0秒
private int quickSort(int[] nums, int l, int r, int k) {
if (l >= r) return nums[l];
int x = nums[l + r >> 1];
int i = l - 1;
int j = r + 1;
while (i < j) {
while (nums[++i] < x) ;
while (nums[--j] > x) ;
if (i < j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
return k <= j ? quickSort(nums, l, j, k) : quickSort(nums, j + 1, r, k);
}
public int majorityElement(int[] nums) {
return quickSort(nums, 0, nums.length - 1, nums.length / 2);
}
方法3:1秒
public int majorityElement(int[] nums) {
int res = nums[0];
int count = 1;
for(int i = 1; i < nums.length; i++){
if(nums[i] == res){
count++;
}
else if(count > 1){
count--;
}
else{
res = nums[i];
}
}
return res;
}