非最优解,仅学习记录
题目要求:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
算法思路:
本来想法:用一个数组res记录对应数出现的个数,nums中的数为数组res的下标,每次出现重复数,去该下标对应数+1,最终遍历res输出所有元素数大于n/2(向下取整)的数下标。(没行的通,待完善)
参考题解:摩尔投票法,消消乐原理,不同出栈相同入栈,最终留下的一定是最多的且栈中所有元素均相同故可直接返回栈顶元素。高效便捷。
class Solution {
public:
int majorityElement(vector<int>& nums) {
int n=nums.size();
stack<int> s;
s.push(nums[0]);//先将第一个元素压入栈中
for(int i=1;i<n;i++){
// 栈非空则判断,相同入栈不同出栈
if(!s.empty()){
if(nums[i]!=s.top()){
s.pop();
}else{
s.push(nums[i]);
}
}else{
//栈空则直接入栈
s.push(nums[i]);
}
}
return s.top();
}
};