JZ28 数组中出现次数超过一半的数字
描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。你可以假设数组是非空的,并且给定的数组总是存在多数元素。1<=数组长度<=50000,0<=数组元素<=10000。
示例1
输入:[1,2,3,2,2,2,5,4,2]
返回值:2
思路一
快排,取最中间的元素即可(手写的快排在牛客中栈溢出????,力扣就没问题)。
解答
package com.klaus.math.prob28;
import java.util.Arrays;
public class Solution {
public int MoreThanHalfNum_Solution(int[] array) {
qSort(array, 0, array.length - 1);
// Arrays.sort(array);
return array[array.length / 2];
}
private void qSort(int[] arr, int low, int high) {
if (low >= high) return;
int i = low, j = high, tmp = arr[low];
while (i < j) {
while (i < j && arr[j] >= tmp) j--;
while (i < j && arr[i] <= tmp) i++;
if (i < j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[low] = arr[i];
arr[i] = tmp;
qSort(arr, low, i - 1);
qSort(arr, i + 1, high);
}
}
思路二
使用haspmap,数组中的元素作为 key,元素每出现一次,就把 key 对应的value +1。最后遍历 hashmap,找到 value 大于二分之一数组长度的 key。
解答二
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int MoreThanHalfNum_Solution(int[] array) {
HashMap<Integer, Integer> map = new HashMap<>();
int len = array.length / 2;
for (int a : array) {
int cnt = map.getOrDefault(a, 0);
map.put(a, cnt + 1);
}
for (Map.Entry<Integer, Integer> m : map.entrySet()) {
if (m.getValue() > len)
return m.getKey();
}
return 0;
}
}
思路三
解答三
package com.klaus.math.prob28;
public class Solution3 {
public int MoreThanHalfNum_Solution(int[] array) {
int vote = 0, x = 0;
for (int num : array) {
if (vote == 0) x = num;
vote += num == x ? 1 : -1;
}
return x;
}
}