leetcode 229. Majority Element II
题意:给你一个数组,让你找出里面出现次数大于[n/3]次的数,n是数组总数。
要求:时间复杂度O(n),空间复杂度O(1)
思路:题目感觉很熟悉,剑指offer里面有一道题目是找一个数组里面出现超过一般的数,往那方面想。
首先,出现超过[n/3]的数最多只有两个。
我们用a1,a2表示这两个数,num1,num2表示这个数出现的次数。
遍历整个数组,和a1,a2相同的话,num1,num2加1,不同的话减1;
a1,a2没有值得话赋值。
但是a1,a2出现的次数不一定超过[n/3],但是次数肯定是最多的两个。
最后再看看次数就好了。
class Solution { public: vector<int> majorityElement(vector<int>& nums) { vector<int> ans; if(nums.size() == 0) return ans; int cout1=0,cout2=0,num1 = -1,num2 = -1; for(int i=0;i<nums.size();i++) { if( nums[i] == num1) { cout1++; } else if( nums[i] == num2) { cout2++; } else if(cout1 == 0 ) { cout1++; num1 = nums[i]; } else if(cout2 == 0 ) { cout2++; num2 = nums[i]; } else { cout1--; cout2--; } } cout1 = cout2 = 0; for(auto n:nums) if(n == num1) cout1++; else if(n == num2) cout2++; if(cout1 > nums.size() / 3) ans.push_back(num1); if(cout2 > nums.size() / 3) ans.push_back(num2); return ans; } };