题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路:本题定义两个变量,一个存储可能数目超过一半的值val,一个数是该值得出现次数
1)如果次数为0,就把当前访问的数组值存入val,times = 1;
2)如果此处不为1,且当前数组值等于val,times++
3)否则就--
本题注意事项:使用该方法,最后存的val出现次数为数组的一半,可能是数组的最后一个元素,因此需要校验是否数目超过数组一半
1 class Solution { 2 public: 3 int MoreThanHalfNum_Solution(vector<int> numbers) { 4 int times = 1; 5 int n = numbers.size(); 6 int val = numbers[0]; 7 for(int i=1;i<n;i++) 8 { 9 if(times == 0) 10 { 11 val = numbers[i]; 12 times = 1; 13 14 } 15 else if(val == numbers[i]) 16 { 17 times++; 18 } 19 else 20 { 21 times--; 22 } 23 } 24 if(!CheckMoreThanHalf(numbers,n,val)) 25 return 0; 26 27 return val; 28 } 29 bool CheckMoreThanHalf(vector<int> numbers,int n,int val) 30 { 31 int times = 0; 32 for(int i=0;i<n;i++) 33 { 34 if(numbers[i] == val) 35 times++; 36 } 37 if(times >= n/2) 38 return true; 39 else 40 return false; 41 } 42 };