题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
采用阵地攻守的思想:
第一个数字作为第一个士兵,守阵地;count = 1;
遇到相同元素,count++;
遇到不相同元素,即为敌人,同归于尽,count--;
当遇到count为0的情况,又以新的i值作为守阵地的士兵,继续下去,到最后还留在阵地上的士兵,有可能是主元素。
再加一次循环,记录这个士兵的个数看是否大于数组一般即可。
代码:
1 public class Solution { 2 public int MoreThanHalfNum_Solution(int [] array) { 3 if(array == null || array.length == 0){ 4 return 0; 5 } 6 int count = 0; 7 int num = array[0]; 8 for(int i = 0;i< array.length; i++){ 9 //如果count==0,将下一个值赋给num 10 if(count == 0 && (i+1)<array.length){ 11 num = array[i+1]; 12 } 13 //如果遇见相同的元素,count++ 14 if(num == array[i]){ 15 count = count + 1; 16 }else{ //如果遇见不相同的元素,count-- 17 count = count - 1; 18 } 19 } 20 //遍历num的个数 21 int number = 0; 22 for(int i = 0; i < array.length; i++){ 23 if(array[i] == num){ 24 number++; 25 } 26 } 27 //判断num的个数是否大于数组长度的一半 28 if(number > array.length/2){ 29 return num; 30 }else{ 31 return 0; 32 } 33 } 34 }
原文地址:https://www.cnblogs.com/maohaitao/p/11455916.html
时间: 2024-10-07 14:35:19