问题描述
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
思路分析
给一个数组,返回数组中出现次数超过 ⌊n/3⌋ 次的元素。要求线性时间, O(1) 的空间复杂度。
因为出现次数要超过 ⌊n/3⌋ 次,这样的元素至多有两个,所以就用a、b分别表示这两个元素,并且两个元素有相应的count,然后开始遍历数组。
第一次遍历的目的是确定两个出现次数最多的元素,所以count为零了就换成新的元素;与a或者b相等了count++;否则count–。这样找到了两个元素,是循环结束后出现次数最多的两个,但这是必要不充分的。然后第二次循环,统计这两个元素出现的次数是否真的多于 ⌊n/3⌋ 次,然后根据次数看是否要存进结果中去。
代码
class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int n = nums.size();
int count1 = 0, count2 = 0, a = 0, b = 0;
for (auto i : nums){
if (a == i)
count1++;
else if (b == i)
count2++;
else if (count1 == 0){
a = i;
count1 = 1;
}
else if (count2 == 0){
b = i;
count2 = 1;
}
else{
count1--;
count2--;
}
}
vector<int> res;
count1 = count2 = 0;
for (auto i : nums){
if (i == a)
count1++;
else if(i == b)
count2++;
}
if (count1 > n / 3)
res.push_back(a);
if (count2 > n / 3)
res.push_back(b);
return res;
}
};
时间复杂度:
O(n)
空间复杂度:
O(1)
反思
必要不充分的。一开始往三个元素上想,还是没有注意题目中的more than。