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的处 ...
随机推荐
- CAS简介
概念 CAS(Compare And Swap 比较并交换),是 乐观锁 的一种典型实现机制. 乐观锁主要的两个步骤:冲突检测.数据更新. 当多个线程尝试使用CAS同时更新通过一个变量的时候,只有一个 ...
- 简述安霸pipeline及其关键参数--raw域模块
何为pipeline: sensor输出是一种叫Bayer 格式的RAW数据图像.ISP 对RAW数据图像的处理流程就是我们说的ISP PipeLine.通过PipeLine的处理,我们可以从一副RA ...
- TD课程通最终版本体验
功能上,新版本增加了学校教室的上课情况,有无课程可以清楚查询,如下图: 在添加课程的设置上有改进,相比于之前编辑课程后不能保存,新版本在可保存的基础上又增加了登陆教务系统的功能,学生使用更加方便快捷, ...
- JDBC01 获取数据库连接
概述 Java Database Connectivity(JDBC)直接访问数据库,通用的SQL数据库存取和操作的公共接口,定义访问数据库的标准java类库(java.sql,javax.sql) ...
- day01互联网架构理论
- day09 文件属性
day09 文件属性 昨日回顾 yum底层原理: 第一步:执行yum install nginx安装命令 第二步:yum去/etc/yum.repos.d这个目录中 第三步:根据/etc/yum/re ...
- Linux:sqlldr命令
第一步:写一个 ctl格式的控制文件 CTL 控制文件的内容 : load data --1. 控制文件标识 infile 'xxx.txt' --2. 要导入的数据文件名 insert into t ...
- 【Linux】【Services】【Docker】网络
容器的网络模型: closed container: 仅有一个接口:loopback 不参与网络通信,仅适用于无须网络通信的应用场景,例如备份.程序调试等: --net none bridged co ...
- 【Service】【Database】【MySQL】基础
1. 概念 1.1. 作者:Unireg 1.2. MySQL AB --> MySQL Solaris:二进制版本: 1.3. 官方网站: MySQL: www.mysql.com Maria ...
- 加密解密、食谱、新冠序列,各种有趣的开源项目Github上都有
Github上是我们程序员学习开源代码.提升编程技巧的好地方.好学校,但是除了学习,小伙伴们有没有发现过Github上一些特别有意思的项目呢? 今天TJ君就来和大家分享几个自认为特别有趣的开源项目: ...