分治法找到数组中出现次数超过一半的元素

2024-04-21 09:12

本文主要是介绍分治法找到数组中出现次数超过一半的元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

分治法找到数组中出现次数超过一半的元素

输入格式:

1.数组元素个数
2.元素值

输入样例:

5
1 2 1 1 4

输出样例:

1
#include <stdio.h>
#define N 100010
int arr[N],n;
//Boyer-oore投票算法
int ie(int *arr,int n){int c = arr[0];int count = 1;//选举出可能的数字for(int i = 1;i<n;i++){if(count == 0){c = arr[i];count = 1;}else if(c == arr[i])count++;elsecount--;}//检查该数字是否多于一般int result = 0;for(int i = 0;i<n;i++){if(c == arr[i])result++;}//判断次数返回对应的值if(result>n/2)return c;elsereturn -1;
}
int main() {scanf("%d",&n);for(int i = 0;i<n;i++){scanf("%d",&arr[i]); }int c = ie(arr,n);if(c == -1)printf("未检测到\n");elseprintf("%d",c);return 0;
}

核心代码:

for(int i = 1;i<n;i++){if(count == 0){c = arr[i];count = 1;}else if(c == arr[i])count++;elsecount--;}

这段代码是 Boyer-Moore 投票算法的核心部分,用于在数组中找到一个出现次数超过一半的元素。算法的第一轮投票过程如下:

  1. 初始化候选元素和计数器

    • c 变量初始化为数组的第一个元素 arr[0]
    • count 变量初始化为 1,表示 c 已经被计数了一次。
  2. 遍历数组进行投票

    • 从数组的第二个元素开始遍历(即索引为 1 的元素),直到数组的最后一个元素。
  3. 更新候选元素和计数器

    • 对于当前遍历到的元素 arr[i]
      • 如果 count 为 0,这意味着我们需要选择一个新的候选元素。这时,我们将 arr[i] 设为新的 c,并将 count 设为 1,重新开始计数。
      • 如果 arr[i] 与当前的 c相同,这意味着我们为 c 增加了一票,因此 count 加 1。
      • 如果 arr[i] 与 c 不同,这意味着 c 丢失了一票,因此 count 减 1。
  4. 结束条件

    • 当遍历完整个数组后,count 将会是 0(如果数组中没有元素出现次数超过一半),或者 count 大于 0(如果存在一个 candidate 出现次数超过一半)。

这个算法的关键在于,如果数组中存在一个元素出现次数超过一半,那么在投票过程中,这个元素最终会被选为 c,并且 count 将会是正数。这是因为,每当我们遇到一个与当前 c不同的元素时,我们只是简单地减少 count,直到 count 为 0,然后选择下一个元素作为新的 c。这样,最终的 c 一定是出现次数最多的元素。

然而,这个算法只找到了一个候选元素,它还需要通过第二轮检查来确认这个候选元素是否真的出现次数超过一半。如果第二轮检查失败(即 c 的出现次数没有超过一半),算法将返回 -1,表示没有元素满足条件。

注意:这种算法只是可能选出这个数,大家可以举一组数据执行一遍,几乎选出来的都是对的。

这篇关于分治法找到数组中出现次数超过一半的元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922701

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求