博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode 229.求众数II
阅读量:4979 次
发布时间:2019-06-12

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

求众数II

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

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

示例 1:

输入: [3,2,3]

输出: [3]

示例 2:

输入: [1,1,1,3,3,2,2,2]

输出: [1,2]

 

摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。

解题思路

由于数组中出现次数超过 13

的数字最多只可能为两个,所以记录两个数字n1、n2,以及他们出现的次数c1、c2,遍历数组并做以下操作:

  • 若当前两数字出现则把对应的次数加1;
  • 若其中一个出现次数为0,则把当前数字赋给出现次数为0的数字,并将其出现次数置为1;
  • 若当前数字不同于任何一个数字,则将两数字的出现次数都减1

最后得到两个数字以及他们出现的次数,再遍历一遍数组记录他们的出现次数,若大于 n3

则加入到结果中。

 

1 import java.util.ArrayList; 2 import java.util.List; 3  4 class Solution { 5     public List
majorityElement(int[] nums) { 6 List
res=new ArrayList
(); 7 if(nums==null||nums.length==0) return res; 8 int n1=nums[0],n2=0,c1=1,c2=0; 9 for(int i=1;i
nums.length/3) res.add(n1);29 if(c2>nums.length/3) res.add(n2);30 return res;31 }32 }

 

 

转载于:https://www.cnblogs.com/kexinxin/p/10203084.html

你可能感兴趣的文章
用css 实现凹陷的线条
查看>>
hadoop2.6.0实践:A03 例子验证
查看>>
Grails连接mysql数据库
查看>>
input-file 部分手机不能拍照问题
查看>>
C#面向对象编程
查看>>
ES6 随记(1)-- let 与 const
查看>>
Windows Server 2003中的网络负载平衡技术的实现方法
查看>>
Android 二维码 生成和识别(附Demo源码)
查看>>
[dt]世纪历史长河年代表
查看>>
DNS的域名/IP映射
查看>>
【转】C++ STL中常见容器的时间复杂度
查看>>
西电网络攻防大赛一个简单的上传绕过
查看>>
20145201 《信息安全系统设计基础》第14周学习总结
查看>>
【UNIX】select、poll、epoll学习
查看>>
sql 查看数据库环境及一些参数
查看>>
如何找出两个数组的相同元素?如果是多维数组呢?值类型除了基本类型还有引用类型呢?...
查看>>
江城子-苏轼
查看>>
Flask Web学习笔记(六)
查看>>
java 除法向上,向下取整
查看>>
Servlet的监听器
查看>>