题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路1:
如果长度是偶数,要想长度超过一半,一定有两个相同的数挨着
如果长度是奇数,有两种情况,一种是从第一个数到最后一个数隔一个是一个相同的,另一种是也一定有两个相同的数挨着。
代码:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int len = array.length;
int num = 0;
int result = 0;
if(len == 0){
return 0;
}
if(len == 1){
return array[0];
}
if(len % 2 == 0){//是偶数
for(int i = 0; i < len-1; i++){
if(array[i] == array[i+1]){
int temp1 = array[i];
for(int j = 0; j < len; j++){
if(array[j] == temp1){
num++;
if(num > (len/2)){
result = temp1;
}
}
}
}
}
}
if(len % 2 != 0){//奇数
for(int i = 0; i < len-3; i++){
num = 1;
if(array[i] != array[i+2]){
break;
}else{
num++;
}
result = array[1];
}
for(int i = 0; i < len-1; i++){
if(array[i] == array[i+1]){
int temp2 = array[i];
for(int j = 0; j < len; j++){
if(array[j] == temp2){
num++;
if(num > (len/2)){
result = temp2;
}
}
}
}
}
}
return result;
}
}
思路2:
遍历数组,记录出现的值和出现的次数,如果当前值和下一个值相同次数加1,如果不同,次数减1
次数减至0时,保存下一个数,次数从1开始
代码:
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
int num = 0;
int result = 0;
int len = array.length;
if(len == 0){
return 0;
}
if(len == 1){
return array[0];
}
if(len > 1){
result = array[0];
num = 1;
for(int i = 1; i < array.length; i++){
if(array[i] == result){
num++;
}else{
num--;
if(num == 0 && i < len-1){
result = array[i];
num = 1;
}
}
}
if(num == 0){
result = 0;
}
}
return result;
}
}