5292. 划分数组为连续数字的集合

给你一个整数数组 nums 和一个正整数 k,请你判断是否可以把这个数组划分成一些由 k 个连续数字组成的集合。

如果可以,请返回 True;否则,返回 False。

示例 1:
输入:nums = [1,2,3,3,4,4,5,6], k = 4
输出:true
解释:数组可以分成 [1,2,3,4] 和 [3,4,5,6]。

题目表述为集合,不是数组。 =__=

输入:nums = [3,3,2,2,1,1], k = 3
输出:true

分析:

需要将数组按照k个一组划分。所以一共有len / k 个集合。如果不能整除说明不符合条件。

因为考虑到是集合,所以先将数组进行排序。

  • 首先用map统计每个数字才出现的次数。
  • 然后遍历数组的每个元素。
    • 从map中取出每个元素的出现次数。如果数量为0,说明该元素已经被包含到其他的集合啦,可以跳过了。

      • 每取出一个元素,就可以将保存的个数-1。
    • 然后就开始查询符合条件的集合。
      • 从map中分别取出num+i的元素剩余次数,i从1到len / k
      • 如果次数为0,说明当前的这一个集合不符合条件。返回false
    • 写到这里已经可以得到结果。但是在后序的查询过程中可能存在很多已经将数量减少到0的元素。
      • 为了减少后序操作,定义一个变量m。维护已经出现的符合条件的集合的次数。如果m等于len/k,说明已经找到了全部符合条件的集合返回true;
public boolean isPossibleDivide(int[] nums, int k) {
int len = nums.length;
if(len%k!=0){
return false;
}
Arrays.sort(nums);
Map<Integer,Integer> map = new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
int count = len/k;
int m = 0;
for(int num:nums){
int start = map.get(num);
if(start==0){
//已经没有了
continue;
}
map.put(num,start-1);
for(int i =1;i<k;i++){
int temp = map.getOrDefault(num+i,0);
if(temp==0){
//当前序列不合法。
return false;
}
map.put(num+i,temp-1);
}
m++;
if(m==count){
return true;
}
}
return true;
}

5293. 子串的最大出现次数

给你一个字符串 s ,请你返回满足以下条件且出现次数最大的 任意 子串的出现次数:

子串中不同字母的数目必须小于等于 maxLetters

子串的长度必须大于等于 minSize 且小于等于 maxSize

输入:s = "aababcaab", maxLetters = 2, minSize = 3, maxSize = 4
输出:2
解释:子串 "aab" 在原字符串中出现了 2 次。
它满足所有的要求:2 个不同的字母,长度为 3 (在 minSize 和 maxSize 范围内)。

这道题需要寻找的是满足条件的出现次数最大的任意子串的次数。

  • 虽然给定了最大和最小长度,实际上只需要使用最小的长度就能计算处出现的最大次数。
  • 在计算出现次数的基础上,题目需要保证子串字母数量小于等于maxLetter,当然使用Set结合计算数量。如果不符合条件就舍弃当前子串。
  • 为了保证在串s长度极长的情况下不会超时。可以使用Map保存每个串出现的次数。
  • 在遍历结束后,统计集合中出现的最大次数,即为结果。
public int maxFreq(String s, int maxLetters, int minSize, int maxSize) {
char[] arr= s.toCharArray();
Map<String,Integer> map = new HashMap<>();
for(int i =0;i<=s.length()-minSize;i++){
if(checkOut(arr,i,i+minSize-1)<=maxLetters){
String key = String.valueOf(arr,i,minSize);
map.put(key,map.getOrDefault(key,0)+1);
}
}
int count = 0;
for(Integer num : map.values()){
count = count<num ?num:count;
}
return count;
}
public int checkOut(char[] arr,int start,int end){
Set<Character> set = new HashSet<>();
for(int i =start;i<=end;i++){
set.add(arr[i]);
}
return set.size();
}

随缘记录 LeetCode第168场周赛 2019-12-22的更多相关文章

  1. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  2. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  3. LeetCode 第 167 场周赛

    1290.二进制链表转整数 1291.顺次数 1292.元素和小于等于阈值的正方形的最大边长 1293.网格中的最短路径 1290.二进制链表转整数 1290.二进制链表转整数 给你一个单链表的引用结 ...

  4. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  5. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  6. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  7. LeetCode 第 150 场周赛

    一.拼写单词(LeetCode-1160) 1.1 题目描述 1.2 解题思路 由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArra ...

  8. Leetcode 第137场周赛解题报告

    今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...

  9. Leetcode 第135场周赛解题报告

    这周比赛的题目很有特点.几道题都需要找到一定的技巧才能巧妙解决,和以往靠数据结构的题目不太一样. 就是如果懂原理,代码会很简单,如果暴力做,也能做出来,但是十分容易出错. 第四题还挺难想的,想了好久才 ...

随机推荐

  1. gitlab持续集成,自动部署

    写这篇文章的目的是,实现提交代码到gitlab上的一个项目时,自动打包,并将包发布到另一台服务器上,重启tomat.如有问题,可以联系本人QQ:409838567 gitlab-ci,是基于gitla ...

  2. 安装DHCP到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:DHCP-x 硬件要求:无 安装过程 1.安装YUM源,由EPEL提供 [root@localh ...

  3. Maven的作用

    Maven的作用 1.在开发中,为了保证编译通过,我们会到处去寻找jar包,当编译通过了,运行的时候,却发现"ClassNotFoundException",我们想到的是,难道还差 ...

  4. 常用的一些git命令整合

    一.创建一个版本库 1.mkdir xxx 2.git init 使用git init命令将这个目录变成Git可以管理的仓库 这个版本仓库创建好了,xxx目录下有一个隐藏的.git目录(里面有暂存区( ...

  5. 另外一种获取redis cluster主从关系和slot分布的方法

    条条大路通罗马,通过最近学习redis cluster 观察其输出,发现了另外一种获取master-slave关系的方法. [redis@lxd-vm1 ~]$ cat get_master_slav ...

  6. java - synchronized与lock的区别

    synchronized与lock的区别 原始构成 synchronized是关键字属于JVM层面 monitorenter(底层是通过monitor对象来完成,其实wait/notify等对象也依赖 ...

  7. 【Unity|C#】基础篇(18)——正则表达式(Regex类)

    [学习资料] <C#图解教程>:https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.com/s/ ...

  8. 手把手带你开发一款 IIS 模块后门

    https://cloud.tencent.com/developer/article/1507913 首先准备工具 VS2017 IIS 开始开发 先打开 VS 创建一个 winfrom 项目然后添 ...

  9. 用cmd打开TXT(中文)文件,以及创建空文件,删除文件,改变输入法

    编码               十进制 ut-8                65001 GBK               936 美国英语        437 windows cmd 默认为 ...

  10. Pytest学习10-pytest与unittest的区别

    一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...