2021-08-23:超级水王问题。扩展1:摩尔投票。扩展2:给定一个正数K,返回所有出现次数>N/K的数。
2021-08-23:超级水王问题。扩展1:摩尔投票。扩展2:给定一个正数K,返回所有出现次数>N/K的数。
福大大 答案2021-08-23:
扩展1:
1.如果无候选,当前数就是候选,血为1。
2.如果有候选。
2.1.当前数==候选数,血++。
2.2.当前数!=候选数,血–。
最后遍历验证。
时间复杂度:O(N)。
空间复杂度:O(1)。
扩展2:k-1个候选。
最后遍历验证。
代码用golang编写。代码如下:
package main
import (
"fmt"
)
func main() {
arr := []int{1, 2, 1, 5, 1, 1, 2}
printHalfMajor(arr)
fmt.Println("--------")
printKMajor(arr, 7)
}
func printHalfMajor(arr []int) {
cand := 0
HP := 0
for i := 0; i < len(arr); i++ {
if HP == 0 {
cand = arr[i]
HP = 1
} else if arr[i] == cand {
HP++
} else {
HP--
}
}
if HP == 0 {
fmt.Println("no such number.")
return
}
HP = 0
for i := 0; i < len(arr); i++ {
if arr[i] == cand {
HP++
}
}
if HP > len(arr)/2 {
fmt.Println(cand)
} else {
fmt.Println("no such number.")
}
}
func printKMajor(arr []int, K int) {
if K < 2 {
fmt.Println("the value of K is invalid.")
return
}
// 攒候选,cands,候选表,最多K-1条记录! > N / K次的数字,最多有K-1个
cands := make(map[int]int)
for i := 0; i != len(arr); i++ {
if _, ok := cands[arr[i]]; ok {
cands[arr[i]] = cands[arr[i]] + 1
} else { // arr[i] 不是候选
if len(cands) == K-1 { // 当前数肯定不要!,每一个候选付出1点血量,血量变成0的候选,要删掉!
allCandsMinusOne(cands)
} else {
cands[arr[i]] = 1
}
}
}
// 所有可能的候选,都在cands表中!遍历一遍arr,每个候选收集真实次数
reals := getReals(arr, cands)
hasPrint := false
for key, _ := range cands {
if reals[key] > len(arr)/K {
hasPrint = true
fmt.Println(fmt.Sprintf("%d", key) + " ")
}
}
if hasPrint {
fmt.Println("")
} else {
fmt.Println("no such number.")
}
}
func allCandsMinusOne(map0 map[int]int) {
removeList := make([]int, 0)
for key, value := range map0 {
if value == 1 {
removeList = append(removeList, key)
}
map0[key] = value - 1
}
for removeKey, _ := range removeList {
delete(map0, removeKey)
}
}
func getReals(arr []int, cands map[int]int) map[int]int {
reals := make(map[int]int)
for i := 0; i != len(arr); i++ {
curNum := arr[i]
if _, ok := cands[curNum]; ok {
if _, ok2 := reals[curNum]; ok2 {
reals[curNum] = reals[curNum] + 1
} else {
reals[curNum] = 1
}
}
}
return reals
}
执行结果如下:

2021-08-23:超级水王问题。扩展1:摩尔投票。扩展2:给定一个正数K,返回所有出现次数>N/K的数。的更多相关文章
- web前端项目中遇到的一些问题总结(08.23更新)
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 写一些最近工作中Vue项目中遇到的问题. 巴啦啦小魔仙,污卡拉,全身变,小 ...
- 2021.08.16 P1260 工程规划(差分约束)
2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...
- 2021.08.01 P4359 伪光滑数(二叉堆)
2021.08.01 P4359 伪光滑数(二叉堆) [P4359 CQOI2016]伪光滑数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 若一个大于 11 的整数 MM ...
- 2021.07.23 P3275 糖果(差分约束)
2021.07.23 P3275 糖果(差分约束) [P3275 SCOI2011]糖果 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.为了满足更多更多约束条件,合适地 ...
- http://www.cnblogs.com/gaojing/archive/2011/08/23/2413616.html
http://www.cnblogs.com/gaojing/archive/2011/08/23/2413616.html
- 2021.08.30 前缀函数和KMP
2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...
- 2021.08.16 P1078 文化之旅(最短路)
2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...
- 2021.08.16 P1300 城市街道交通费系统(dfs)
2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...
- 2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意)
2021.08.16 P1363 幻象迷宫(dfs,我感受到了出题人浓浓的恶意) P1363 幻象迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 幻象迷宫可以认为是无限 ...
- 2021.08.10 Euler函数总结
2021.08.10 Euler函数总结 知识: 记 φ(n) 表示在 [1,n] 中与 n互质的数的个数. 1.p为质数,则 \[φ(p^l)=p^l-p=p^{l-1}(p-1) \] 注:每p个 ...
随机推荐
- ElasticSearch在linux环境安装和启动
1.下载 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-8-0 2.安装启动 2.1 错误1 Java HotSp ...
- 【python】yaml文件的读写
[python]yaml文件的读写 冰冷的希望 2020-10-22 18:31:47 442 收藏 1分类专栏: python 文章标签: python yaml版权 python专栏收录该内容67 ...
- Neo4j学习(2)--简单入门
1.Neo4j属性图数据模型 节点:包含多个属性和标签.一个节点就是一条数据 属性:键值对形式 关系:单向与双向,连接节点,也可包含多个属性和标签 标签:表示节点和关系的类型,可以有多个,同时可以通过 ...
- 11.4 显示窗口(harib08d)11.5 小实验(hearib08e) 11.6 高速计数器(harib08f)
11.4 显示窗口(harib08d) 书P206 11.5 小实验(hearib08e) 书P208 11.6 高速计数器(harib08f) 书P209
- Linux & 标准C语言学习 <DAY8_1>
一.进制转换 1.为什么要使用二进制.八进制.十六进制 因为目前的CPU只能识别高低两种电平,只能对二进制数据进行计算 二进制虽然能够直接被计算机识别,但是不方 ...
- 后疫情时代,RTE“沉浸式”体验还能这么玩?丨RTE 2022 编程挑战赛赛后专访
前言 9 月 17 日,由声网.环信与 RTE 开发者社区联合主办的"RTE 2022 编程挑战赛"圆满落幕.从 300+ 支参赛队伍中冲出重围的 27 支决赛队伍,在元宇宙中用精 ...
- MybatisPlus------代码生成器
快速开发: 代码生成器: (1)模版:MyBatisPlus提供 (2)数据库相关配置:读取数据库获取信息 (3)开发者自定义配置:手工配置 package com.ithema; import co ...
- MyBatis中的#和$有什么区别
什么是MyBatis MyBatis是一款优秀的持久层框架,特别是在国内(国外据说还是 Hibernate 的天下)非常的流行,我们常说的SSM组合中的M指的就是#mybatis#. MyBatis支 ...
- java网络编程--4 UDP
java网络编程--4 UDP 1.7.UDP 发短信:不用连接,但是需要知道对方的地址 主要包含两个类:DatagramPacket 和 DatagramSocket 发送消息 发送端: packa ...
- node.js介绍及简单例子
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...