注意:数组中有没有次数超过一半的数字。
方法1
运用数组的特性:数组中有一个数字的个数超过了数组长度的一半,那么这个数字一定是数组中的中位数。
基于快排算法 --> 求数组总第k大的数字 O(n)
public class Solution { public int Partition(int[] array, int l, int r) { int x = array[l]; while (l < r) { while (l < r && array[r] >= x) r--; array[l] = array[r]; while (l < r && array[l] <= x) l++; array[r] = array[l]; } array[l] = x; return l; } public int MoreThanHalfNum_Solution(int[] array) { if (array == null) { return 0; } int mid = array.length >> 1; int l = 0, r = array.length - 1, index = 0; while (index != mid) { index = Partition(array, l, r); if (index > mid) { r = index - 1; } else if (index < mid) { l = index + 1; } } int count = 0; for (int i = 0; i < array.length; i++) { if (array[i] == array[index]) { count++; } } return count > mid ? array[index] : 0; } }
方法2
遍历数组时保存两个值:一个是数字中的一个数字,另一个是次数。
public class Solution { public int MoreThanHalfNum_Solution(int[] array) { if (array == null) { return 0; } int count = 0, num = -1; for (int i = 0; i < array.length; i++) { if (count == 0) { count++; num = array[i]; continue; } if (array[i] == array[i - 1]) { count++; } else { count--; } } count = 0; for (int i = 0; i < array.length; i++) { if (array[i] == num) { count++; } } return count > array.length / 2 ? num : 0; } }