title: 数组中出现次数超过一半的数字 date: 2019-08-21T11:00:41+08:00 draft: false categories: offer
public int MoreThanHalfNum_Solution(int[] array) {
int start = 0, end = array.length - 1;
int mid = array.length / 2;
int index = partition(array, start, end);
if (index == mid) {
return array[index];
}
while (index != mid && start <= end) {
if (index > mid) {
end = index - 1;
index = partition(array, start, end);
} else {
start = index + 1;
index = partition(array, start, end);
}
}
if (checkIsHalf(array, index)) return array[index];
return 0;
}
private boolean checkIsHalf(int[] array, int index) {
if (index < 0) {
return false;
}
int count = 0;
for (int i : array) {
if (array[index] == i) {
count++;
}
}
return count > array.length / 2;
}
private int partition(int[] array, int start, int end) {
if (start >= array.length || start < 0
|| end >= array.length || end < 0) {
return -1;
}
int key = array[start];
int left = start, right = end;
while (left < right) {
while (left < right && array[right] >= key) {
right--;
}
if (left < right) {
array[left] = array[right];
left++;
}
while (left < right && array[left] <= key) {
left++;
}
if (left < right) {
array[right] = array[left];
right--;
}
}
array[left] = key;
return left;
}