题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路:
这道题应该是之前本科是上算法课做过的题目。两种思路。
思路一:
对数组进行排序,那么中间位置的数就是出现次数超过一半的数。这种做法的时间复杂度为O(nlogn)。
思路二:
题目中要找的数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。
因此我们可以考虑在遍历数组的时候保存两个值:一个是数组中的一个数字flag,一个是次数count。
当我们遍历到下一个数字的时候,
如果下一个数字和当前我们保存的数字相同,则次数加 1;
如果和当前我们保存的数字不同,则次数减 1;
当次数减到 0 的时候,我们将保存的数字改为当前遍历所处的位置,并将次数更改为 1。
注意,在扫描结束后,需要再次确认一次,将数组中的数字与flag做一次比较,超过数组半数以上,则输出flag,否则输出0。
代码:
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { if(numbers.size()==0) return 0; int count=1; int flag = numbers[0]; for(int i=1; i<numbers.size(); i++) { if(flag != numbers[i]) { count--; if(count<=0) { flag = numbers[i]; count = 1; } } else count++; } int counts = 0; for(int i = 0; i<numbers.size(); i++) { if(flag == numbers[i]) counts++; } if(counts>(numbers.size()/2)) return flag; else return 0; } };