leetCode 229. 多数元素 II + k值摩尔投票法 + 进阶 + 优化空间

news2024/12/23 3:50:43

229. 多数元素 II - 力扣(LeetCode)


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

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


(1)哈希表

class Solution {
public:
    // 哈希
    vector<int> majorityElement(vector<int>& nums) {
        unordered_map<int,int> mp;
        for(const int& a:nums) mp[a]++;
        int n = nums.size() / 3;
        int i=0;
        vector<int> ans;
        for(auto &it:mp) {
            if(it.second > n) ans.push_back(it.first); 
        }
        return ans;
    }
};

(2) 摩尔投票法

推荐看这篇文章,有关摩尔投票法的介绍:229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/123170/liang-fu-dong-hua-yan-shi-mo-er-tou-piao-fa-zui-zh/① k=1时,举个栗子

  • 初始化

  • 执行流程 

② k=2时,举个栗子 

  • 初始化

class Solution {
public:
    // 摩尔投票法
    vector<int> majorityElement(vector<int>& nums) {
        // 创建返回值
        vector<int> res;
        if (nums.empty() || nums.size() == 0) return res;
        // 初始化两个候选人candidate,和他们的计票
        int cand1 = nums[0],count1 = 0;
        int cand2 = nums[0],count2 = 0;

        // 摩尔投票法,分为两个阶段:配对阶段 和 计数阶段
        // (1) 配对阶段
        for(const int &num : nums) {
            // 投票
            if(cand1 == num) {count1++;continue;}
            if(cand2 == num) {count2++;continue;}

            // 第 1 个候选人配对
            if(count1 == 0) {
                cand1 = num;
                count1++;
                continue;
            }

            // 第 2 个候选人配对
            if(count2 == 0) {
                cand2 = num;
                count2++;
                continue;
            }

            count1--;
            count2--;
        }

        // (2)计数阶段 : 找到了两个候选人之后,需要确定票数是否满足大于 N/3
        count1=0;
        count2=0;
        for(const int &num : nums) {
            if (cand1 == num) count1++;
            else if (cand2 == num) count2++;
        }

        if (count1 > nums.size() / 3) res.push_back(cand1);
        if (count2 > nums.size() / 3) res.push_back(cand2);
        return res;
    }
};

(3)进阶版 k值投票法

class Solution {
public:
    // k值摩尔投票法
    int k = 3;
    vector<int> majorityElement(vector<int>& nums) {
        // 创建返回值
        vector<int> res;
        if (nums.empty() || nums.size() == 0) return res;
        if (nums.size() == 1) return nums;
        int n = k-1, m = 2, cands[n][m];
        memset(cands, 0, sizeof(cands));
        for(int i=0;i<n;i++) {
            cands[i][0]=nums[0];
            // cands[i][1]=0;
        }

        // 摩尔投票法,分为两个阶段:配对阶段 和 计数阶段
        bool voteflag=0;
        bool matchflag = 0;
        for(const int &num : nums) {
            for(int i=0;i<n;i++) {
                // 投票
                if(cands[i][0] == num) {cands[i][1]++;voteflag=1;break;}
                else voteflag=0;
            }
            if(voteflag) continue;
            
            for(int i=0;i<n;i++) {
                // 第 i 个候选人配对
                if(cands[i][1] == 0) {
                    cands[i][0] = num;
                    cands[i][1]++;
                    matchflag=1;
                    break;
                }
                else matchflag=0;
            }
            if(matchflag) continue;

            for(int i=0;i<n;i++) {
                cands[i][1]--;
            }
        }
        // (2) 计数阶段
        for(int i=0;i<n;i++) {
            if(cands[i][1]==0) cands[i][0] = INT_MAX;
            cands[i][1]=0;
        }
        for(const int &num : nums) {
            for(int i=0;i<n;i++) 
                if (cands[i][0] == num ) {
                    cands[i][1]++;
                }
        }
        for(int i=0;i<n;i++) {
            if (cands[i][1] > nums.size() / k ) res.push_back(cands[i][0]);
        }
        return res;
    }
};

总结来自作者:我脱下短袖

  • 如果至多选一个代表,那他的票数至少要超过一半(⌊ 1/2 ⌋)的票数;
  • 如果至多选两个代表,那他们的票数至少要超过 ⌊ 1/3 ⌋ 的票数;
  • 如果至多选m个代表,那他们的票数至少要超过 ⌊ 1/(m+1) ⌋ 的票数。
  • 所以以后碰到这样的问题,而且要求达到线性的时间复杂度以及常量级的空间复杂度,直接套上摩尔投票法。

作者:我脱下短袖
链接:https://leetcode.cn/problems/majority-element-ii/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐和参考文章:

229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/123170/liang-fu-dong-hua-yan-shi-mo-er-tou-piao-fa-zui-zh/229. 多数元素 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/majority-element-ii/solutions/1060343/gong-shui-san-xie-noxiang-xin-ke-xue-xi-ws0rj/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“RG-SMP 安全管理平台” 优化

全局添加ICO图标 管理强制重定向https <!-- \SMP\jboss\server\default\deploy\smp.war\common common_js.jsp --> <link rel"shortcut icon" href"data:image/x-icon;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAAAAAAAAA…

通俗易懂的GPT原理简介

GPT是自然语言处理领域中最受欢迎的模型之一。GPT全称为Generative Pre-trained Transformer&#xff0c;是一种基于Transformer模型的预训练语言模型。在接下来的文章中&#xff0c;我们将详细介绍GPT的原理。 一、前置知识 在了解GPT原理之前&#xff0c;需要了解以下一些基…

【2023年冬季】华为OD统一考试(B卷)题库清单(已收录345题),又快又全的 B 卷题库大整理

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治递归…

【Linux】-进程控制(深度理解写时拷贝、exit函数、return的含义以及makefile编译多个程序)-进程创建、进程终止、进程等待、进程程序替换

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

基于SSM的品牌手机销售信息系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

dash--项目的前端展示简单基础

1.前置工作 创建虚拟环境&#xff1a; sudo apt-get install python3-venv # 安装 python3 -m venv venv # 在本目录下创建venv虚拟环境&#xff08;也是一个文件夹。如果用不到这个虚拟环境以后就rm -rf venv&#xff09; source venv/bin/activate # 激活虚拟环境临时使用清华…

精通Nginx(01)-产品概览

Nginx是当今使用最广泛的 Web 服务器之一。2021年W3Techs 宣布&#xff0c; Nginx市场份额超越 Apache HTTP Server 成为全球最常用的 Web 服务器&#xff0c;最新Web Server排名如图所示&#xff08;实际超过4亿站点实用Nginx&#xff09;。 Nginx由Igor Sysoev在2001年创建&…

一年一度表白代码(动态表白)

效果图 # coding:utf-8 import sys import os import random import pygame from pygame.locals import *WIDTH, HEIGHT = 640, 480 BACKGROUND =

目标检测算法改进系列之添加EIOU,SIOU,AlphaIOU,FocalEIOU等

YOLOv8添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU等 yolov8中box_iou其默认用的是CIoU&#xff0c;其中代码还带有GIoU&#xff0c;DIoU&#xff0c;文件路径&#xff1a;ultralytics/yolo/utils/metrics.py&#xff0c;函数名为&#xff1a;bbox_iou 原始代码 def bbox_i…

Qt:关闭对话框,动画实现窗体逐渐缩小到消失

关键技术&#xff1a; 1、使用QPropertyAnimation对象&#xff0c;实现动画效果&#xff0c;逐渐缩小窗体尺寸&#xff0c;以及透明度&#xff1b; 2、在对话框缩小时&#xff0c;要将界面中的控件都隐藏起来&#xff0c;并且将对话框布局的Margin修改成0 代码如下&#xff…

机器学习 | 决策树算法

一、决策树算法概述 1、树模型 决策树&#xff1a;从根节点开始一步步走到叶子节点(决策)。所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归。 在分类问题中&#xff0c;表示基于特征对实例进行分类的过程&#xff0c;可以认为是if-then的集合&#xff0…

软件测试项目职责与分工、测试流程

一、项目职责与分工 1、产品经理 ------> 负责设计产品的原型图和PRD。 2、项目经理 ------>负责并保证高质量的产品按时完成和发布的专职管理人员。 3、开发人员 ------> 负责完成公司新产品开发计划&#xff1b;开发人员主要分为 前端开发、后端开发、IOS开发和安…

Linux rm命令:删除文件或目录

当 Linux 系统使用很长时间之后&#xff0c;可能会有一些已经没用的文件&#xff08;即垃圾&#xff09;&#xff0c;这些文件不但会消耗宝贵的硬盘资源&#xff0c;还是降低系统的运行效率&#xff0c;因此需要及时地清理。 rm 是强大的删除命令&#xff0c;它可以永久性地删除…

搞定蓝牙-第六篇(HID

搞定蓝牙-第六篇&#xff08;HID&#xff09; ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现&#xff0c;电脑连接了蓝牙键盘就可以直接使用了&#xff0c;不需要配置任何东西&#xff0c;那么&#xff0c;这两者是怎么通讯的呢。我们使用的电脑windows系统内…

这个故事有点长 - 舟山

这个故事有点长 - 舟山 &#x1f449;故事的开始 这是一个很长的故事&#xff0c;到底有多长呢&#xff1f;大概也就有六七年那么长吧。刚来上海时就一直想去看海&#xff0c;后来终于如愿以偿了&#xff0c;具体记不清了&#xff0c;只记得当时坐了地铁&#xff0c;又坐了几个…

TensorRT量化实战课YOLOv7量化:YOLOv7-PTQ量化(一)

目录 前言1. YOLOv7-PTQ量化流程2. 准备工作3. 插入QDQ节点3.1 自动插入QDQ节点3.2 手动插入QDQ节点 前言 手写 AI 推出的全新 TensorRT 模型量化实战课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 该实战课程主要基于手写 AI 的 Latte 老师所出的 Tens…

一年一度表白代码(自定义表白)

代码有什么不懂可以私信我 动态画下面的效果图,自定义名字和表白词 源代码 import turtle import time# 画心形圆弧 def hart_arc():for i in range(200):turtle.right(1

一年一度表白代码(发射爱心)

代码有什么不懂可以私信我 动态画下面的效果图,发射爱心,可改名字 源代码 import turtle import time# 画心形圆弧 def hart_arc():for i in range(200):turtle.righ

电源控制系统架构(PCSA)之系统控制处理器

安全之安全(security)博客目录导读 目录 一、系统控制处理器 1、服务 2、可信操作 一、系统控制处理器 SCP是一种基于处理器的能力&#xff0c;为提供电源管理功能和服务提供了一个灵活和可扩展的平台。 在移动系统中&#xff0c;SCP处理器一般是Cortex-M微控制器&#xff…

Visual Studio Code 中安装 DevChat 的体验与评测

Visual Studio Code 中安装 DevChat 的体验与评测 1.前言 在软件开发的过程中&#xff0c;我们常常需要与团队成员进行高效的沟通&#xff0c;而现有的开发工具并未将沟通工具与软件开发环境有效地结合起来。然而&#xff0c;DevChat却为像我们这样的开发者提供了非常便利的解…