本文共 577 字,大约阅读时间需要 1 分钟。
给定一个整数数组,其中有一个数字的出现次数大于总数组大小的一半。
思路一:快排,时间开销O(nlogn),空间开销O(logn),然后去数组的中间那个数字即可
思路二:采用打擂台的方法。只需要O(n)的时间开销,O(1)的空间开销。维护一个champion记录守擂人,count记录守擂人的生命数。然后依次遍历整个数组,如果数字相同则生命数+1,如果数字不同,则生命-1,如果生命降到0,则换上新的擂主。由于目标数字出现的个数占总的一半以上,因此目标数字作为守擂人一定能够站到最后。
class Solution {
public:
int majorityElement(vector<int> &num) {
int champion = num[0];
int count = 1;
for (size_t i = 1; i < num.size(); i++)
{
if (count == 0)
{
champion = num[i];
count = 1;
continue;
}
if (champion == num[i])
{
count++;
}
else
count--;
}
return champion;
}
};
转载于:https://www.cnblogs.com/flyjameschen/p/4317681.html