39 数组中出现次数超过一半的数字
题目
数组中一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为 9 的数组{1,2,3,2,2,2,5,4,2}。由于数字 2 在数组中出现了 5 次,超过数组长度的一半,因此输出 2。
C++ 题解
方法一
如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
在遍历数组时保存两个值:
- 数组中一个数字
- 出现的次数。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int>& nums)
{
int count = 1, val = nums[0];
for (int i = 1; i < nums.size(); i ++)
{
if (nums[i] == val)
count++;
else
count--;
if (count == 0)
{
val = nums[i];
count = 1;
}
}
// 统计最高频数字一共出现的次数
count = 0;
for (int i = 0; i < nums.size(); i ++)
{
if(val == nums[i])
count++;
}
// 最高频数字出现的额次数大于数组长度的一半才有效,否则返回0
if(count*2 <= nums.size())
{
val = 0;
}
return val;
}
};
方法二
数组排序后,如果符合条件的数存在,则一定是数组中间那个数:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty())
return 0;
sort(numbers.begin(),numbers.end());
int middle = numbers[numbers.size()/2];
int count=0; // 出现次数
for(int i=0;i<numbers.size();++i)
{
if (middle==numbers[i])
count ++;
}
return count*2 > numbers.size() ? middle : 0;
}
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
if not numbers:
return 0
count = 1
val = numbers[0]
# 注意此处略过第一个元素
for i in numbers[1:]:
if i == val:
count += 1
else:
count -= 1
if count == 0:
val = numbers[i]
count = 1
count = 0
for i in numbers:
if val == i:
count += 1
return val if count*2 > len(numbers) else 0
方法二
# -*- coding:utf-8 -*-
class Solution:
def MoreThanHalfNum_Solution(self, numbers):
# write code here
if not numbers:
return 0
numbers.sort()
middle = numbers[len(numbers)/2]
count = 0
for i in numbers:
if middle == i:
count += 1
return middle if count*2>len(numbers) else 0