leetcode5225最大相等频率
题目
正整数数组nums,找到满足条件的最长前缀,返回其长度。该前缀满足:删除一个元素后,剩下的每个数字出现的次数相同。
ps:如果删除后没有元素存在,也可以认为每个数字有相同的次数。
数组长度:[2,105],元素值:[2,105]
解答
在遍历数组的过程中,计算每个数字的频率映射val2Freq,再统计频率的频率。对于满足条件的前缀,此刻的‘频率的频率’有以下几种可能:
- 所有元素频率相等,除了其中一个元素多了一个:freq2Freq大小为2,且他们的key的差为1,大的那个值为1
- 一个值出现一次,其他值出现一次:freq2Freq大小为1,val为1。
- 一个值出现一次,其他值出现相同次数(>1次):freq2Freq大小为2,且其中一个key为1且值为1.
- 一个值出现一次,其他值出现0次:freq2Freq大小为1,key为1且值为1.
遍历过程中记录满足条件的前缀出现时对应的最大i即可。
时间复杂度:O(N),空间复杂度O(N)用map来记录频率。
public int maxEqualFreq(int[] nums) {
Map<Integer,Integer> val2Freq=new HashMap<>();
Map<Integer,Integer> frq2ffrq=new HashMap<>();
int res=0;
for (int i = 0; i < nums.length; i++) {
int val=nums[i];
int newFrq= addMap(val2Freq,val,1);
//从原有map中移除
int oldFrq=newFrq-1;
if(oldFrq!=0)
addMap(frq2ffrq,oldFrq,-1);
//
addMap(frq2ffrq,newFrq,1);
if(frq2ffrq.size()==2){
ArrayList<Integer> vals= new ArrayList<>(frq2ffrq.keySet());
int a=vals.get(0);
int b=vals.get(1);
if(a>b){
int tmp=a;
a=b;
b=tmp;
}
//a<b
if(a==1&&frq2ffrq.get(a)==1){
res=i;
}else if(b-a==1&&frq2ffrq.get(b)==1){
res=i;
}
}else if(frq2ffrq.size()==1){
int key=new ArrayList<>(frq2ffrq.keySet()).get(0);
if(key==1||frq2ffrq.get(key)==1) {
res = i;
}
}
}
return res+1;
}
private int addMap(Map<Integer, Integer> val2Freq, int key, int val) {
if(val2Freq.containsKey(key)){
val=val2Freq.get(key)+val;
val2Freq.put(key,val);
}else {
val2Freq.put(key,val);
}
if(val==0){
val2Freq.remove(key);
}
return val;
}
leetcode5225最大相等频率的更多相关文章
- 在thinkphp中,写的博文标签多对多关系的标签频率统计算法
常常看到别人的博客里面,或者网站里面有这样随机颜色,但字体大小与标签出现频率有关的标签云,于是自己就想写一个.至于颜色的随机显示,那就很简单了,这里就不列代码. 因为正在学thinkphp,所以数据查 ...
- pwm 占空比 频率可调的脉冲发生器
module xuanpin #(parameter N=25)(clk,clr,key_in_f,key_in_z,f_out);input clk,clr,key_in_f,key_in_z;ou ...
- [LeetCode] Sort Characters By Frequency 根据字符出现频率排序
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- java重置定时器频率
public class BallUtil { public static Timer fisTimer ; public static void fisStartBall(){ long first ...
- CDCE913产生任意频率
1,上TI官网下载CDCE913的datasheet和配置软件clock Pro.如果只需要配置CDCE913成某一个固定频率,那么用clock Pro可以很方便快捷. TI的初衷应该就是通过I2C配 ...
- ORACLE查看SQL的执行次数/频率
在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的S ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 访问频率限制功能实现、防止黑客扫描、防止恶意刷屏
很多软件组件,大家都能想到了,大家也能做出来,但是成熟稳定.可靠.易用.功能全面,可信任,可相信,可开源就不是很容易,需要树立良好的口碑才可以. 1:往往会有黑客,进行撞库挖掘漏洞,很多系统的账户有可 ...
- web系统访问频率限制
无论是spring mvc还是struts,都可以为controller或者aciton执行前,增加拦截器. 通过拦截器中的逻辑控制,可以实现访问频率的限制. 首先构造访问频率数据类 class Fr ...
- 由于某IP大频率提交评论导致服务器宕机
早上突然收到dnspod的宕机通知(好久没收到了,有点手足无措). 服务器在上午10:40时达到85%.uptime显示cpu利用率达到35.不宕才怪. 按照之前的经验,应该是触发一个特别耗CPU的处 ...
随机推荐
- phpexcel 另存Excel文件方式
$w = new PHPExcel_Writer_Excel5($e); $dir = 'path/title.xls'; $w->save($dir);
- javaWeb - 2 — ajax、json — 最后附:后台获取前端中的input type = "file"中的信息 — 更新完毕
1.ajax是什么? 面向百度百科一下就知道了,这里就简单提炼一下 Ajax即Asynchronous Javascript And XML(异步JavaScript和XML).当然其实我们学的应该叫 ...
- python格式化输出的两种方式对比
1.%符号方法和format()函数方法 2.对比: 1 print('我今年%d岁' %22.125) 2 print('我今年{0:f}'.format(22.125)) 3 #报错 4 #槽中类 ...
- 一起手写吧!Promise!
1.Promise 的声明 首先呢,promise肯定是一个类,我们就用class来声明. 由于new Promise((resolve, reject)=>{}),所以传入一个参数(函数),秘 ...
- Android获取通知栏的高度
1 public static int getStatusBarHeight(Context context){ 2 Class<?> c = null; 3 ...
- clickhouse客户端使用
测试初始化 clickhouse-client -m create database if not exists test; use test; drop table test; create tab ...
- Linux_spool命令
spool的作用是什么? spool的作用可以用一句话来描述:在sqlplus中用来保存或打印查询结果. 参数指南 对于SPOOL数据的SQL,最好要自己定义格式,以方便程序直接导入,SQL语句如: ...
- MySQL(2):数据管理
一. 外键概念: 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主表,具有此外键的表 ...
- 【Java】【设计模式】单例设计模式
思想: 为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象 为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 代码体 ...
- Windows下80端口被占用的解决方法(SQL Server)
查找80端口被谁占用的方法 进入命令提示行(WIN+R 输入 CMD),输入命令 netstat -ano|findstr 80 (显示包含:80的网络连接) ,就可以看到本机所有端口的使用情况,一般 ...