候选法(最佳解法)
时间复杂度:O(N)
空间复杂度:O(1)
如果把数字当作人种,一个数字和另外数字打了起来,同归于尽,最后剩下的是不是人数最多的那种人。这里要满足一个条件:某类人的数目一定要大于总人数的一半。
**算法步骤:**选择输入数组的第一个元素作为候选元素target,设置其出现次数为1,随后遍历数组,当遇到和target相同的元素,cnt+1;不同的元素,cnt-1.当cnt==0时,选择下一个元素作为候选元素,并且置cnt=1,遍历到数组的最后,剩下的target就是要求的结果。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int target = numbers[0];
int cnt = 1;
for(int i = 1; i < numbers.size(); ++i)
{
if(cnt == 0)
{
target = numbers[i];
cnt = 1;
}
else if(numbers[i] == target)
{
++cnt;
}
else
{
--cnt;
}
}
cnt = 0;
for(int i = 0; i < numbers.size(); ++i)
{
if(target == numbers[i])
++cnt;
}
return cnt > numbers.size()/2 ? target : 0;
}
};
排序
时间复杂度:O(nlogn)
空间复杂度:O(1)
排序后,出现次数超过一半的数字,一定在中间位置,然后检测中间位置是否符合要求。
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
// 排序
sort(numbers.begin(), numbers.end());
return numbers[numbers.size()/2];
}
};