1.问题描述:

给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。重数最大的元素为该集合的众数。

例如,S={1,2,2,2,3,5},众数是2,其重数是3。

对于给定的多重集S,计算S的众数与重数。

2.思路:

1).首先假设中间的元素是众数
2). 然后由两边向中间遍历,直到左右都出现值等于众数的数,记录下众数和重数;
3). 这样就将一个数组分为三部分,我们再对左右部分执行上述步骤;若左边数组的个数大于中位数的个数,则递归左边数组,同理右边相同;

4). 注意:使用分治策略解决众数问题需要原集合有序,在原集合无序的情况下需要对其排序,建议数据输入之后先进行排序

ps:如果出现多组众数,以最后一组为最终答案。

3.Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n,m,T;
int a[N];
int ans = 0; //众数的重数
int idx = 0; //众数的下标void split(int l,int r) {//分治算法if(l > r) return;int ll = l; //记录原来的l位置int rr = r; //记录原来的r位置int mid = (l + r) >> 1;for(; l < mid && a[l] != a[mid]; l ++ ); //寻找众数的最左边(即左边开始第一个众数)for(; r > mid && a[r] != a[mid]; r -- ); //寻找众数的最右边(即左边开始最后一个众数)//经过两个for循环后,众数个数就是r - l + 1if(ans <= r - l + 1) {//递归过程中发现重数更大的众数,就及时更新答案if(ans == r - l + 1)idx = min(mid,idx);//此步操作保证若得到多组重数相等的众数,则选择下标小的elseidx = mid;ans = r - l + 1;}if((l - 1) - ll + 1 >= ans) //若左边数组的个数大于中位数的个数,则递归左边数组(若不大于则没必要,因为即使有众数也不可能重数大于当前重数)split(ll,l - 1); if(rr - (r + 1) + 1 >= ans) //若右边数组的个数大于中位数的个数,则递归右边数组split(r + 1,rr);
}int main(){scanf("%d",&n);for(int i = 0; i < n; i ++ )scanf("%d",a + i);sort(a,a + n); //排序(后续操作均是基于升序)int l = 0;int r = n - 1;split(l,r);printf("%d\n%d\n",a[idx],ans);return 0;
}

4.代码运行截图:

分治法---众数问题相关推荐

  1. c语言分治法求众数重数_算法实验二 分治法 众数问题.pdf

    算法实验二 分治法 众数问题 算法分析与设计实验二 分治法 主要内容 • 实验目的 • 主要实验仪器设备和环境 • 实验内容 • 实验要求 • 注意点 实验目的 • 理解分治法的基本思想 • 针对特定 ...

  2. python众数问题给定含有n个元素的多重集合s_分治法求众数 给定含有n个元素的多重集合S 联合开发网 - pudn.com...

    分治法求众数 所属分类:数据结构 开发工具:C/C++ 文件大小:240KB 下载次数:3 上传日期:2018-01-04 20:19:09 上 传 者:九鼎 说明:  给定含有n个元素的多重集合S, ...

  3. c语言分治法求众数重数_分治法求众数 - osc_twlari2q的个人空间 - OSCHINA - 中文开源技术交流社区...

    分治法求众数 Problem Description 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为 众数.例如,S={1,2,2,2,3,5}. ...

  4. c语言分治法求众数重数_分治算法:求众数及其重数

    问题描述: 给定含有 n 个元素的多重集合 S,每个元素在 S 中出现的次数称为该元素的重数.多重集合 S 中重数最大的素称为众数.例如多重集合 S={1,2,2,7,2,7,5},其中众数是 2,其 ...

  5. 分治法求众数和重数(含文件输入输出)

    [mie haha的博客]转载请注明出处(万分感谢!): https://blog.csdn.net/qq_40315080/article/details/88580999 (可以列出所有众数) 代 ...

  6. c语言分治法求众数重数_分治法实现众数问题--例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3。对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数。...

    题目的描述: 例如:S={1,2,2,2,3,5},则多重集S的众数是2,其重数为3. 对于给定的由m个自然数组成的多重集S,计算出S的众数及其重数. 众数------一组元素中出现的次数是最多的 重 ...

  7. 分治法求解集合的众数及其重数

    1. 分治法 分治法解题过程主要分为分.治.合三个步骤",应用该方法的基本过程如下: (1) 将原问题分解为若干个规模较小的子问题 (2) 对这些子问题分别求解 (3) 对各个子问题的解进行 ...

  8. 算法设计--众数和重数问题(分治法)

    问题描述: 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数.多重集S中重数最大的元素称为众数.例如,S={1,2,2,2,3,5}.多重集S的众数是2,其重数为3.对于给定的n ...

  9. c语言分治法求众数重数_分治法求众数问题 (配图)

    标签: 采用分治法,以中间为界限, 先计算围绕中间这个数字的众数情况,然后左右分开递归计算结果,取最值即可. 左右递归计算的时候要先做判断,假如左边或是右边的个数都比已求的重数小,就没必要计算了,即使 ...

最新文章

  1. “私有云”安全的“过渡”时期-“云朵”方案的设计思路
  2. opencvsharp中resize图像
  3. Apache Ant 1.9.13和1.10.5发布–支持Java 11单文件源程序
  4. java怎么将程序保存在桌面_在Java桌面应用程序中保留数据的最佳方法是什么?...
  5. qcombobox 隐藏_Qt之QComboBox定制
  6. 关于读《ajax后退解决方案(一)》笔记
  7. 教你一招解决#65279导致页面莫名其妙空行
  8. 成为java高级工程师需要什么
  9. 对于自己(Android)秋招的一点总结(感慨)
  10. Qt自定义进度条示例
  11. MATLAB/Simulink仿真 并网型风光混储直流微电网 实现:功率分配、削峰填谷、平抑功率波
  12. java毕业设计青岛滨海药店管理系统的设计与实现源码+lw文档+mybatis+系统+mysql数据库+调试
  13. 学习笔记(01):3华为工程师 ,带你实战C++(2018版)-09面向对象的思想实战
  14. 中望3D 2021 插入基准面 - 2实体构面法
  15. 计算机辅助设计基础试题,CAD基础知识自测题
  16. 卡卷接口API文档分享
  17. adb tcpip:5555,appium 运行报错
  18. 硬件设计原理图Checklist 参考案例二 【转载】
  19. ACM题解——贪心专题——木头加工
  20. 使用Charles不能抓取到Ios手机的数据包

热门文章

  1. Kerberos 入门与常用操作 浅析
  2. [c语言]小课堂 day5
  3. 腾讯最新股权结构曝光:Naspers持股31.1% 马化腾持股8.61%
  4. mysql数据库升级工具_MySQL数据库升级
  5. java查询黑屏_在我的iPhone上测试我的应用程序时获取黑屏
  6. “这个文件已在资源编辑器外被修改,你要重新载入它吗?”
  7. 解决:win10 休眠项消失,无法使用休眠 powercfg /h /size 50 连到系统上的设备没有发挥作用
  8. 计算机毕设Python+Vue银行理财推荐系统(程序+LW+部署)
  9. 起点中文网(主要是在目录下创建文件)
  10. 秃头(生发)是一种怎样的体验【发际线编辑】