本题来自《剑指offer》 数组中出现一半次数的数字
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路:
两种思路:
A:采用排序,由于超过一半,那么中间值便是目标值。时间效率采用快排队的话为O(n)。
B:题目要求数字超过了一半,才会输出,那么该数字的个数会比其他的数字个数多1.统计从第一个数字开始,如果后面的数字在前面的数字中出现那么就加1,否则就减1,如果计数器等于0,则将当前的值作为该值,从1开始计数开始。
最后遍历统计,数组中出现该数字的个数,如果大于等于数组长度的一半,那么该值便是。否则便返回0。
C++ Code:
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { if (numbers.size()<=0){ //边界判断,如果小于0,则返回0 return 0; } int result = numbers[0]; //假设第一个值就是目标值 int times = 1; //计数器从1开始 int length = numbers.size(); //数组的长度 for (int i=1;i<length;i++){ if (times == 0){ //如果计数器等于0的时候 result = numbers[i]; //那么就假设当前的值为目标值 times = 1; //计数器从1开始计数 }else if(result == numbers[i]){ //如果当前的值在前面中出现过,则计数器递增 times ++; }else{ times --; //如果没有出现,那么计数器便递减 } } int count=0; //计数器,统计目标值在数组中出现的次数 for (int i=0;i<length;i++){ if (numbers[i]==result){ count ++; } } if (count>length>>1){ //如果该次数大于数组长度的一半,那么该值符合 return result; } return 0; //否则就返回0 } };