1. 问题描写叙述
在一个无序的整数数组nums[](大小为n)中。找出出现次数大于n/3的全部数。即找出数字numsi的出现次数k,满足k>?n/3?。
2. 方法与思路
首先。能够通过分析得到结论:满足条件的数字个数cnt最多为2。
证明: ifcnt>2?cnt× (?n/3?+1 )>n 超出原数组的大小。
然后,借鉴在数组中求出现次数超过一半的数
这道题的思路:
1). 第一遍扫描,设两个计数器和变量记录数组nums[]中出现频率最高的数。
2). 第二遍扫描,计算着两个数出现的次数。
3). 推断这两个数是否符合要求,符合则存入结果集。
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
vector<int> re;
if(nums.size() ==0) return re;
if(nums.size() == 1) return nums;
int i,num1,num2,cnt1=0,cnt2=0;
//找出出现频率最高的两个数
for(i = 0; i < nums.size(); i++)
{
if(cnt1 == 0 || num1 == nums[i])
{
num1 = nums[i];
cnt1++;
}
else if(cnt2 == 0 || num2 == nums[i])
{
num2 = nums[i];
cnt2++;
}
else
cnt1--,cnt2--;
}
//统计两个数出现的次数
cnt1 = 0; cnt2 = 0;
for(i = 0; i < nums.size(); i++)
{
if(nums[i] == num1) cnt1++;
else if(nums[i] == num2) cnt2++;
}
//推断是否否何要求
if(cnt1 > nums.size()/3)
re.push_back(num1);
if(cnt2 > nums.size()/3)
re.push_back(num2);
return re;
}
};
时间: 2024-10-11 12:36:13