博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
寻找一个长度为3n的数组中出现次数超过n的元素
阅读量:5268 次
发布时间:2019-06-14

本文共 746 字,大约阅读时间需要 2 分钟。

思路1: 排序,然后扫描一遍,这样的复杂度主要在于排序,时间复杂度为O(n log n)

思路2: 可以借用快速排序的思想,先用O(n)的时间找到n/3位置的元素,再用O(n)的时间找到2n/3位置的元素,出现次数超过n次的元素是这两个中的一个,扫描一边统计一下次数就完成了。

思路3: 每次删掉3个不同的元素,保留两个不同的元素以及他们出现的频率,最后两个元素中,频率高的元素既是所求。下面是ocaml的代码

let find lst =  let rec find_int c1 v1 c2 v2 l =    match l with     [] -> if c1 > c2 then v1 else v2    | h::rest -> if h = v1 then find_int (c1+1) v1 c2 v2 rest                 else if h = v2 then find_int c1 v1 (c2+1) v2 rest                 else if c1 = 0 then find_int 1  h  c2 v2 rest                 else if c2 = 0 then find_int c1 v1 1 h rest                 else find_int (c1-1) v1 (c2-1) v2 rest  infind_int 0 2 0 1 lst;;

这里使用了尾递归的方法来实现,有点是扫描一遍就可以找出来,而且原来数组不需要改动,同时时间复杂度保持在O(n)

转载于:https://www.cnblogs.com/mathlover/p/3525727.html

你可能感兴趣的文章
相对导入与绝对导入
查看>>
71.Edit Distance(编辑距离)
查看>>
深入Dagger:自定义AutoValue
查看>>
3.0 C++远征:模板
查看>>
[转][Prism]Composite Application Guidance for WPF(6)——服务
查看>>
特效:ListBox数据加载特效
查看>>
向保钓人士致敬!
查看>>
play!安装出错:Error: Could not find or load main class Files ...(2012-10-25 09:13:43)
查看>>
设计模式之禅--状态模式
查看>>
3D OpenGL ES
查看>>
怎么在两个内嵌的子网页之间通信?(已解决)
查看>>
C#实现基于ffmpeg加虹软的人脸识别demo及开发分享
查看>>
linux为用户配置java环境变量
查看>>
洛谷——P1775 古代人的难题_NOI导刊2010提高(02)&& P1936 水晶灯火灵(斐波那契数列)...
查看>>
selenium Python自动化 笔记 根据xpath找定位的响应属性 修改链接并打开
查看>>
2017-3-2 C# WindowsForm 中label标签居中显示
查看>>
javascript的use strict(使用严格模式)
查看>>
Django doc summary (7)
查看>>
What's the Agile mean
查看>>
XVII Open Cup named after E.V. Pankratiev. GP of Tatarstan B. White Triangle
查看>>