博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
求众数leetcode(169)+投票算法
阅读量:5103 次
发布时间:2019-06-13

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

求众数

解题思路:Boyer-Moore、KMP

class Solution {    public int majorityElement(int[] nums) {        int len = nums.length;        int conditate = 0;        int count = 0;        for(int i=0;i

 求众数2:

题目:给定一个大小为 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素

解题思路:投票算法

class Solution {    public List
majorityElement(int[] nums) { List
res = new ArrayList<>(); if (nums == null || nums.length == 0) return res; //初始化:定义两个候选人及其对应的票数 int candidateA = nums[0]; int candidateB = nums[0]; int countA = 0; int countB = 0; //遍历数组 for (int num : nums) { if (num == candidateA) { countA++;//投A continue; } if (num == candidateB) { countB++;//投B continue; } //此时当前值和AB都不等,检查是否有票数减为0的情况,如果为0,则更新候选人 if (countA == 0) { candidateA = num; countA++; continue; } if (countB == 0) { candidateB = num; countB++; continue; } //若此时两个候选人的票数都不为0,且当前元素不投AB,那么A,B对应的票数都要--; countA--; countB--; } //上一轮遍历找出了两个候选人,但是这两个候选人是否均满足票数大于N/3仍然没法确定,需要重新遍历,确定票数 countA = 0; countB = 0; for (int num : nums) { if (num == candidateA) countA++; else if (num == candidateB) countB++; } if (countA > nums.length / 3) res.add(candidateA); if (countB > nums.length / 3) res.add(candidateB); return res; }}

投票算法图解:

转载于:https://www.cnblogs.com/erdanyang/p/11496335.html

你可能感兴趣的文章
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
转-求解最大连续子数组的算法
查看>>
算法为啥子那么难【转】
查看>>
对数器的使用
查看>>
OracleOraDb11g_home1TNSListener服务启动后停止,某些服务在未由其他服务或程序使用时将自己主动停止...
查看>>
Redis用户添加、分页、登录、注册、加关注案例
查看>>
练习2
查看>>
【ASP.NET】演绎GridView基本操作事件
查看>>
ubuntu无法解析主机错误与解决的方法
查看>>
尚学堂Java面试题整理
查看>>
08-【jsp重点】
查看>>
小记:xml画一个爱心。
查看>>
MySQL表的四种分区类型
查看>>
7.26
查看>>
dll--二进制层面的复用
查看>>
linux 压缩/解压缩/打包命令
查看>>
守护进程
查看>>
CLR 关于强命名程序集 .
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>