栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

LeetCode——229. 求众数 II[Majority Element II][中等]——分析及代码[C++]
  • 一、题目
  • 二、分析及代码
    • 1. 摩尔投票法
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给定一个大小为 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 majorityElement(vector& 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 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% 的用户。

三、其他

暂无。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346930.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号