解题思路:将数组排序之后,如果数组中有数出现的次数超过了一半,则一定是中间的那个数。
其中排序过程要考虑有重复数字的情况,用堆排序快速排序都可以。判断中间的数是否超过一半有很多种方法,为了锻炼自己,使用二分查找(借鉴九章算法的二分模板)分别找到该数的最左面最右面,得到个数。
主方法:
//快排(考虑重复数字):
//使用两次二分分别找到最左面和最右面(参考的九章算法二分模板)
//辅助方法,交换数组中的两个数
附上堆排序的代码参考(大顶堆)
public int[] heapSort(int[] arr) {
if (arr == null || arr.length == 0)
return null;
buildHeap(arr);
int end = arr.length - 1;
for (int i = end; i > 0; i--) {
swap(arr, 0, i);
adjustHeap(arr, 0, i-1);
}
return arr;
}
//一开始要先建立堆
public void buildHeap(int[] arr) {
int end = arr.length - 1;
for (int i = (end - 1) / 2; i >= 0; i--) {
adjustHeap(arr, i, end);
}
}
//从给定的范围调整堆
public void adjustHeap(int[] arr, int init, int end) {
int tmp = arr[init];
for (int i = init * 2 + 1; i <= end; i = 2 * i + 1) {
if (i != end && arr[i] < arr[i + 1])
i++;
if (tmp > arr[i])
break;
else {
arr[init] = arr[i];
init = i;
}
}
arr[init] = tmp;
}
阅读(2082) | 评论(0) | 转发(0) |