题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
package alex.suda.jzOffer;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Scanner;
public class MoreThanHalfNum_Solution {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[] array = new int[n];
for (int i = 0; i < n; i++) {
array[i] = scanner.nextInt();
}
System.out.println(moreThanHalfNum_Solution(array));
}
}
public static int moreThanHalfNum_Solution(int[] array) {
int len = array.length;
int mid = len / 2;
int low = 0;
int high = len - 1;
int index = partition(array, low, high);
while (index != mid) {
if (index > mid) {
high = index - 1;
index = partition(array, low, high);
} else {
low = index + 1;
index = partition(array, low, high);
}
}
int result = array[mid];
int times = 0;
for (int i = 0; i < len; i++) {
if (array[i] == result) {
times++;
}
}
if (times * 2 <= len) {
return 0;
} else {
return array[mid];
}
}
public static int partition(int[] a, int low, int high) {
int key = a[low];
while (low < high) {
while (low < high && a[high] > key) {
high--;
}
if (low < high) {
a[low] = a[high];
low++;
}
while (low < high && a[low] <= key) {
low++;
}
if (low < high) {
a[high] = a[low];
high--;
}
}
a[low] = key;
return low;
}
public static int moreThanHalfNum_Solution1(int[] array) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int len = array.length;
for (int i = 0; i < len; i++) {
if (!map.containsKey(array[i])) {
map.put(array[i], 1);
} else {
map.put(array[i], map.get(array[i]) + 1);
}
}
Iterator<Entry<Integer, Integer>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Integer, Integer> entry = iterator.next();
if (entry.getValue() > len / 2) {
return entry.getKey();
}
}
return 0;
}
public static int moreThanHalfNum_Solution2(int[] array) {
int len = array.length;
int result = array[0];
int times = 1;
for (int i = 1; i < len; i++) {
if(times == 0){
result = array[i];
times = 1;
}
else if(array[i] == result){
times++;
}
else{
times--;
}
}
int count = 0;
for(int i=0;i<len;i++){
if(array[i] == result){
count++;
}
}
if(count * 2 <= len){
return 0;
}
else{
return result;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128