剑指offer 数组中出现次数超过一般的数字
问题描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
C++代码实现
思路:初始化count为1,记录count不为零时的数字a,当前遍历的数字不为a时,count–,当count减为0时,更新a为当前数字,count置为1,当前遍历的数字为a时,count++,遍历结束后,如果count>0则可能存在,在从头遍历计算a出现个数是否大于数组的一半。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int l = numbers.size();
int count = 1;
int a = numbers[0];
for (int i = 1; i < l; i++)
{
if (numbers[i] == a)
{
count++;
}
else
{
count--;
if (count == 0)
{
a = numbers[i];
count = 1;
}
}
}
if (count)
{
count = 0;
for (int i = 0; i < l; i++)
{
if (numbers[i] == a)
{
count++;
}
}
if (count > l / 2)
return a;
}
return 0;
}
};
python2代码实现
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
count = 1
a = numbers[0]
for i in range(1, len(numbers)):
if numbers[i] == a:
count += 1
else:
count -= 1
if count == 0:
a = numbers[i]
count = 1
if count:
count = 0
for i in range(0, len(numbers)):
if numbers[i] == a:
count += 1
return a if count > len(numbers) / 2 else 0
return 0