《剑指offer》—— 28. 数组中出现次数超过一半的数字(Java)
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
}
}
思路:
其实可以想象一群不同阵营的士兵 去占领一个高低。不同阵营的士兵实力相当,只能一换一。
我们用题目给的数组 array {1,2,3,2,2,2,5,4,2} 来模拟一下,值就是阵营。
遍历数组,读取数组中的值:
array[0]:1号阵营的一个士兵来了, 占领了高地,此时高地有一个 1号阵营的士兵。高地是 1号阵营的。
array[1]:2号阵营的一个士兵来了,和 1号阵营的一个士兵同归于尽了,此时高地没有士兵。 高地是 无人占领的。
array[2]:3号阵营的一个士兵来了, 占领了高地,此时高地有一个 3号阵营的士兵。高地是 3号阵营的。
array[3]:2号阵营的一个士兵来了,和 3号阵营的一个士兵同归于尽了,此时高地没有士兵。 高地是 无人占领的。
array[4]:2号阵营的一个士兵来了, 占领了高地,此时高地有一个 2号阵营的士兵。高地是 2号阵营的。
array[5]:2号阵营的一个士兵又来了, 占领了高地,此时高地有两个 2号阵营的士兵。高地是 2号阵营的。
array[6]:5号阵营的一个士兵来了,和 2号阵营的一个士兵同归于尽了,此时高地有一个 2号阵营的士兵。 高地是 2号阵营的。
array[7]:4号阵营的一个士兵来了,和 2号阵营的一个士兵同归于尽了,此时高地没有士兵。 高地是无人占领的。
array[8]:2号阵营的一个士兵来了, 占领了高地,此时高地有一个 2号阵营的士兵。高地是 2号阵营的。
所以最后高地是 2号阵营的。
我们再遍历一下数组 {1,2,3,2,2,2,5,4,2},看看2号阵营总共有多少人(既 2 的个数),
如果 2 的个数大于数组长度的一半,那么 2 就是我们要找的数字。否则就没有要找的数字
实现:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int result = array[0];
int length = array.length;
int times = 1;
for (int i = 1; i < length; i++){
if(times == 0){
result = array[i];
times = 1;
}else{
if(array[i] == result){
times++;
}else{
times--;
}
}
}
times = 0;
for (int i = 0; i < length; i++){
if (result == array[i]){
times++;
}
}
if (times*2 <= length){
return 0;
}
return result;
}
}