题目

正整数数组nums,找到满足条件的最长前缀,返回其长度。该前缀满足:删除一个元素后,剩下的每个数字出现的次数相同。

ps:如果删除后没有元素存在,也可以认为每个数字有相同的次数。

数组长度:[2,105],元素值:[2,105]

解答

在遍历数组的过程中,计算每个数字的频率映射val2Freq,再统计频率的频率。对于满足条件的前缀,此刻的‘频率的频率’有以下几种可能:

  1. 所有元素频率相等,除了其中一个元素多了一个:freq2Freq大小为2,且他们的key的差为1,大的那个值为1
  2. 一个值出现一次,其他值出现一次:freq2Freq大小为1,val为1。
  3. 一个值出现一次,其他值出现相同次数(>1次):freq2Freq大小为2,且其中一个key为1且值为1.
  4. 一个值出现一次,其他值出现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最大相等频率的更多相关文章

  1. 在thinkphp中,写的博文标签多对多关系的标签频率统计算法

    常常看到别人的博客里面,或者网站里面有这样随机颜色,但字体大小与标签出现频率有关的标签云,于是自己就想写一个.至于颜色的随机显示,那就很简单了,这里就不列代码. 因为正在学thinkphp,所以数据查 ...

  2. 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 ...

  3. [LeetCode] Sort Characters By Frequency 根据字符出现频率排序

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

  4. java重置定时器频率

    public class BallUtil { public static Timer fisTimer ; public static void fisStartBall(){ long first ...

  5. CDCE913产生任意频率

    1,上TI官网下载CDCE913的datasheet和配置软件clock Pro.如果只需要配置CDCE913成某一个固定频率,那么用clock Pro可以很方便快捷. TI的初衷应该就是通过I2C配 ...

  6. ORACLE查看SQL的执行次数/频率

    在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的S ...

  7. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 访问频率限制功能实现、防止黑客扫描、防止恶意刷屏

    很多软件组件,大家都能想到了,大家也能做出来,但是成熟稳定.可靠.易用.功能全面,可信任,可相信,可开源就不是很容易,需要树立良好的口碑才可以. 1:往往会有黑客,进行撞库挖掘漏洞,很多系统的账户有可 ...

  8. web系统访问频率限制

    无论是spring mvc还是struts,都可以为controller或者aciton执行前,增加拦截器. 通过拦截器中的逻辑控制,可以实现访问频率的限制. 首先构造访问频率数据类 class Fr ...

  9. 由于某IP大频率提交评论导致服务器宕机

    早上突然收到dnspod的宕机通知(好久没收到了,有点手足无措). 服务器在上午10:40时达到85%.uptime显示cpu利用率达到35.不宕才怪. 按照之前的经验,应该是触发一个特别耗CPU的处 ...

随机推荐

  1. 对于vue项目更新迭代导致上传至服务器后出现Loading chunk {n} failed和Unexpected token <的解决方式

    相信大家对于vue项目的维护与更新中会遇见很多问题,其中有两种情况最为常见. 一种是Loading chunk {n} failed,这种情况出现的原因是vue页面更新上传至服务器后,由于vue默认打 ...

  2. Zookeeper之创建组,加入组,列出组成员和删除组

    public class CreateGroup implements Watcher { private static final int SESSION_TIMEOUT=5000; //ZooKe ...

  3. Js数组内对象去重

    let person = [ {id: 0, name: "小明"}, {id: 1, name: "小张"}, {id: 2, name: "小李& ...

  4. js 如何全部替代一个子串为另一个子串

    更多描述: 假设有一个字符串 `hello. hello. hello. ` 需要替换为 `AAA`,即把 `hello. ` 替换为 `A` 如果需要全量替换字符串,可以使用 String.prot ...

  5. Shell脚本的条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

  6. gitlab之实战部署

    #:准备Java环境,安装jdk root@ubuntu:~# cd /usr/local/src/ root@ubuntu:/usr/local/src# ls jdk-8u191-linux-x6 ...

  7. liunux 6.5设置网卡默认开启

    编辑如下文件; vi /etc/sysconfig/network-scripts/ifcfg-eth0 把 ONBOOT=no 改为 ONBOOT=yes 好了网卡会在启动机器的时候一起启动了.

  8. SQL count和sum

    count(1).count(*)与count(列名)的执行区别 count(1) and count(字段) 两者的主要区别是 (1) count(1) 会统计表中的所有的记录数,包含字段为null ...

  9. Tomcat(2):配置Tomcat

    1,打开IDEA创建一个项目 2,配置Tomcat服务器 3,运行 5,成功 t t

  10. entfrm-app赋能entfrm零代码开发平台 开启多平台分发

    entfrm-app是基于uni-app 框架.使用 Vue.js 语法开发的移动端 App开源产品.它可以编译为 H5.IOS App.Android App.微信小程序.QQ小程序.钉钉小程序.支 ...