题目描述
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times.
Note: The algorithm should run in linear time and in O(1) space.
题目大意
给定一个无序的数组,要求在O(N)的时间复杂度以及O(1)的空间复杂度内查找出现次数大于 n / 3 次的数字。
示例
E1
E2
解题思路
经LeetCode@orbuluh的提示,应利用Moore's Voting算法进行计算,根据题意可知,在数组中最多只能找到两个符合条件的数字,因此可以将题目理解为,在两个数组中找到两个出现次数大于一半的不同数字。
复杂度分析
时间复杂度:O(N)
空间复杂度:O(1)
代码
class Solution { public: vector<int> majorityElement(vector<int>& nums) { int n = nums.size(), k = n / 3; int num1 = INT_MAX, num2 = INT_MAX, count1 = 0, count2 = 0; // 对所有数字进行投票,找出两个符合条件的数字 for(int num : nums) { if(num == num1) ++count1; else if(num == num2) ++count2; else if(count1 == 0) { num1 = num; count1 = 1; } else if(count2 == 0) { num2 = num; count2 = 1; } else { --count1; --count2; } } // 最后需要判断找出的两个数字是否真的符合条件 count1 = count2 = 0; for(int num : nums) { if(num == num1) ++count1; if(num == num2) ++count2; } vector<int> res; if(count1 > k) res.push_back(num1); if(count2 > k && num1 != num2) res.push_back(num2); return res; } };