注意:数组中有没有次数超过一半的数字。
方法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;
}
}
京公网安备 11010502036488号