LeetCode——229. 求众数 II(Majority Element II)[中等]——分析及代码(C++)

LeetCode——229. 求众数 II[Majority Element II][中等]——分析及代码[C++]

一、题目

给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

示例 1:

输入:[3,2,3]
输出:[3]

示例 2:

输入:nums = [1]
输出:[1]

示例 3:

输入:[1,1,1,3,3,2,2,2]
输出:[1,2]

提示:

  • 1 <= nums.length <= 5 * 10^4
  • -10^9 <= nums[i] <= 10^9

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 摩尔投票法

(1)思路

根据题意,出现超过 ⌊ n/3 ⌋ 次的元素最多只有 2 个,因此可结合摩尔投票法对出现过的元素进行对拼消耗,记录每次留下的 2 个元素及剩余次数。

在对拼中留下是出现超过 ⌊ n/3 ⌋ 次的必要不充分条件,因此需二次遍历,确认 2 个元素的出现次数是否满足要求。

(2)代码

class Solution {
    
    
public:
    vector<int> majorityElement(vector<int>& nums) {
    
    
        int num1 = 0, num2 = 0, cnt1 = 0, cnt2 = 0;//对拼后留下的元素1、2,及元素1、2的剩余次数
        for (int num : nums) {
    
    //遍历数组
            if (num == num1 && cnt1 > 0) {
    
    //新数字为元素1,对应剩余次数增加
                cnt1++;
            } else if ( num == num2 && cnt2 > 0) {
    
    //新数字为元素2,对应剩余次数增加
                cnt2++;
            } else if (cnt1 == 0) {
    
    //元素1为空,将当前数字标记为元素1
                num1 = num;
                cnt1++;
            } else if (cnt2 == 0) {
    
    //元素2为空,将当前数字标记为元素2
                num2 = num;
                cnt2++;
            } else {
    
    //对拼消耗,所有元素剩余次数-1
                cnt1--;
                cnt2--;
            }
        }

        vector<int> ans;//输出数组
        cnt1 = 0;//重置元素1次数
        cnt2 = 0;//重置元素2次数
        for (int num : nums) {
    
    //统计元素1、2的出现次数
            if (num == num1) {
    
    
                cnt1++;
            } else if (num == num2) {
    
    
                cnt2++;
            }
        }
        if (cnt1 > nums.size() / 3) {
    
    //元素1符合要求,则加入答案
            ans.push_back(num1);
        }
        if (cnt2 > nums.size() / 3) {
    
    //元素2符合要求,则加入答案
            ans.push_back(num2);
        }
        return ans;
    }
};

(3)结果

执行用时 :16 ms,在所有 C++ 提交中击败了 33.82% 的用户;
内存消耗 :15.5 MB,在所有 C++ 提交中击败了 31.49% 的用户。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/120916204