C语言学习--摩尔投票算法

目录

1.引入

2.摩尔投票算法

3.具体步骤

3.1抵消阶段

3.2检验过程

4.代码实现

5.总结


1.引入

        今天做题看到一个解题思路真的看不懂,一艘才知道是这个算法。

int majorityElement(int* nums, int numsSize) {
int note=nums[0];
int count=1;
for(int i=1;i<numsSize;i++){if(nums[i]==note){count++;}else{count--;if(count<0){note=nums[i];count=1;}
}}//of for
return note;}

第一种方法就是遍历数组的每一个元素,统计出现的次数。O(n^2)的时间复杂度

第二种方法是排序,我们可以先对数组进行排序,然后判断中间的数是否满足条件,这种做法时间复杂度最低为O(nlogn)。

第三种做法是用哈希表记录元素出现的次数,然后遍历哈希表寻找满足条件的元素,此时时间复杂度为O(n),空间复杂度为O(n)。

2.摩尔投票算法


        摩尔投票法又称多数投票法,主要用于解决一个数组中的众数(要求数量超过数组长度的二分之一)的问题。它的原理如下:

        我们将数组的元素想象成一张张选票,数字代表候选人的序号,每次从数组中取两个元素,如果两个元素相同,则选票数进行累加;如果不相同,则选票进行抵消,直到遍历完整个数组。如果数组中存在符合要求的候选人,则最后剩下的选票一定是最终候选人的序号。(极限一换一规则)

3.具体步骤

3.1抵消阶段


        本阶段将数组的元素(候选人)进行抵消。我们先定义候选人major为第一个元素,然后设置计数器count为1,向后进行遍历,当后续元素和major相等,则count++,否则count--。如果count为0时,就将候选人major改为下一个元素,count置1,以此循环直到数组遍历完毕。如果数组中存在出现次数大于n/2的元素,则最后major一定是这个元素。动图如下:

 

 3.2检验过程

由于我们不知道数组是否存在符合条件的多数元素,所以需要对最后的major进行检验。例如数组为【1,2,3】,最后求出的major为3,但3显然不是数组的多数元素。所以还需遍历一遍数组判断major出现次数是否大于n/2。


4.代码实现

int majorityElement(int* nums, int numsSize){//抵消阶段int count = 1;int major = nums[0];for (int i = 1; i < numsSize; i++){if (count != 0){if (nums[i] == major){count++;}else{count--;}}else{major = nums[i];count = 1;}}//of for//检验阶段int n = 0;for (int i = 0; i < numsSize; i++){if (major == nums[i]){n++;}}if (n > numsSize / 2){return major;}else{return -1;}
}

5.总结

通过以上两道题目,我们了解了摩尔投票算法适用于寻找一个数组中出现次数超过一定比例的元素。

当题目要找出出现次数超过1/2的元素,则至多有1个元素满足

当题目要找出出现次数超过1/3的元素,则至多有2个元素满足

当题目要找出出现次数超过1/4的元素,则至多有3个元素满足

当题目要找出出现次数超过1/n的元素,则至多有n-1个元素(n>=2)满足

至多有n个元素满足,我们就用n个变量和n个计数器来维护这n个元素。当数组遍历完后,还需再次检验这n个元素是否满足题目要求。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电源高低温老化测试条件与方法详解

为了检测和确保电源模块在不同温度和恶劣环境下的工作性能&#xff0c;高低温老化测试是不可或缺的测试步骤。高低温老化测试是电子产品制造过程中的重要一环&#xff0c;电源模块高低温老化测试就是为了检测电源模块在高温和低温下是否可以正常工作。 电源高温老化测试方法 高…

一个你可能不曾注意的小东西,Spring依赖注入Bean类型的8种情况

今天来讲的一个你可能不曾注意的小东西&#xff0c;那就是Spring依赖注入支持注入Bean的类型&#xff0c;这个小东西可能看似没有用但是实际又有点小用。 其实本来这周没打算写文章&#xff0c;但是突然之间就想到了之前有个妹子问过这个问题&#xff0c;并且网上这块东西说的…

Python学习笔记-Flask实现简单的抽奖程序

1.导入flask包和randint包 from flask import Flask,render_template from random import randint 2.初始化 Flask 应用: app Flask(__name__) 3. 定义英雄列表 hero [黑暗之女,狂战士,正义巨像,卡牌大师,德邦总管,无畏战车,诡术妖姬,猩红收割者,远古恐惧,正义天使,无极剑…

字节总部大楼私照流出,做他们的员工需要多牛!

在大厂上班究竟有多香&#xff1f; 大厂的工作环境&#xff0c;只有你想不到的硬核&#xff0c;没有它做不到的。 前段时间&#xff0c;字节跳动在北京办公室的一组私照在网上刷屏&#xff0c;看完我只有一个表情—— 抛开薪资和大厂光环不谈&#xff0c;就冲它的工作环境&…

算法---双指针练习-3(快乐数)

题目 1. 题目解析2. 讲解算法原理鸽巢原理 3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 本题根据鸽巢原理是一定会有环的&#xff0c;最后要么无限循环1&#xff0c;要么碰到一个不为1的重复数继续循环 鸽巢原理 鸽巢原理&#xff08;Pigeonhole P…

C#与python交互(flask发送Get/Post请求)

先运行python&#xff0c;再运行C# **ps: 注意修改端口号**python发送Get/Post请求 # -*- coding: utf-8 -*- # Time : 2024/1/25 15:52 # Author : YY # File : post_test.py # Content&#xff1a;提交数据给客户端 from flask import Flask, request, jsonify, redirect…

【嵌入式——QT】标准对话框

【嵌入式——QT】标准对话框 文件对话框颜色对话框字体对话框输入对话框消息框代码示例 文件对话框 QFileDialog 常用静态函数 getOpenFileName&#xff1a;选择打开一个文件&#xff1b;getOpenFileNames&#xff1a;选择打开多个文件&#xff1b;getSaveFileName&#xff1…

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show()&#xff0c;这种样式不是很好看&#xff0c;所以就想办法重新搞了一个类似弹出消息的功能。原理很简单&#xff0c;就是弹出一个新窗体&#xff0c;然后等几秒窗体自动关闭。 先上效果图&#xff1a; 新建一个MsgHelper.cs类&…

Linux运维工程师不可或缺的10款工具

运维工程师在日常工作中频繁运用的10款工具&#xff0c;并细致阐述每款工具的功能、适用场景以及其卓越之处。 1. Shell脚本&#xff1a; 功能&#xff1a;主要用于自动化任务和批处理作业。 适用场景&#xff1a;频繁用于文件处理、系统管理、简单的网络管理等操作。 优势&…

重生奇迹mu战士大师技能加点怎么加

1、在重生奇迹MU中&#xff0c;战士大师的技能加点需要根据个人的游戏风格和需求来决定。一般来说&#xff0c;战士大师可以优先加点力量和体力&#xff0c;以增加攻击和生存能力。同时&#xff0c;可以适当加点敏捷来提高闪避和命中率。 2、在技能方面&#xff0c;可以根据个人…

云计算项目九:K8S安装

K8S安装 Kube-master安装 按照如下配置准备云主机 防火墙相关配置&#xff1a;禁用selinux&#xff0c;禁用swap&#xff0c;且在firewalld-*。上传kubernetes.zip 到跳板机 配置yum仓库&#xff08;跳板机&#xff09; 跳板机主机配置k8s软件源服务端 [rootjs ~]# yum -y…

5G工业网关是什么?

随着科技的飞速发展&#xff0c;5G技术已经逐渐渗透到我们生活的方方面面。而在工业领域&#xff0c;5G工业网关作为连接工业设备与网络的关键组件&#xff0c;正发挥着越来越重要的作用。HiWoo Box其5G工业网关产品以其卓越的性能和稳定性&#xff0c;正助力企业实现数字化转型…