一个数组里有一个数重复了n/2多次,找到
思路:既然这个数重复了一半以上的长度,那么排序后,必然占据了 a[n/2]这个位置。
class Solution { public: int majorityElement(vector<int>& nums) { sort(nums.begin(),nums.end()); return nums[nums.size()/2]; } };
线性解法:投票算法,多的票抵消了其余人的票,那么我的票一定还有剩的。
int majority; int cnt = 0; for(int i=0; i<num.size(); i++){ if ( cnt ==0 ){ majority = num[i]; cnt++; }else{ majority == num[i] ? cnt++ : cnt --; if (cnt >= num.size()/2+1) return majority; } } return majority;
Majority Element II:
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)检查算法。先排序,然后用一个长度为n/3的窗口来检查两端的数是否相等。
class Solution { public: vector<int> majorityElement(vector<int>& nums) { vector<int> res; int maj_ele; int len=nums.size(); sort(nums.begin(),nums.end()); int index=0; while(index<len) { maj_ele = nums[index]; if(maj_ele == nums[index+len/3]) { res.push_back(maj_ele); while(index<len && maj_ele == nums[++index]) ; } else { index++; } } return res; } };