leetcode 1647
这题就是先统计字符串里每个字符出现的频率,然后用一个set保存不重复的频率,遍历每个频率,不在set里直接累加,在的话就一直减直到不在set里,此时频率大于0则累加。最后答案等于字符串长度减掉累加的频率数。
class Solution {public int minDeletions(String s) {Map<Character, Integer> freq = new HashMap<>();for (int i = 0; i < s.length(); i++) {int cnt = freq.getOrDefault(s.charAt(i), 0);freq.put(s.charAt(i), cnt + 1);}boolean[] visited = new boolean[100001];int sum = 0;for (Map.Entry<Character, Integer> e : freq.entrySet()) {int index = e.getValue();while (index > 0 && visited[index]) {index--;}if (index > 0) {visited[index] = true;sum += index;}}return s.length() - sum;}
}
上面是我第一版的代码,写完之后提交发现很慢,然后回头看觉得蠢的不行,我明明只用到了每个字符的频率,那根本不需要用map,因为a-z就26个字符嘛,直接用长度26的int[]就行了。然后我这个10^5+1的数组也是开的令人窒息,直接用一个set保存频率就行了。
优化之后的代码如下。
class Solution {public int minDeletions(String s) {int[] freq = new int[26];for (int i = 0; i < s.length(); i++) {freq[s.charAt(i) - 'a']++;}Set<Integer> uniqueFreq = new HashSet<>();int sum = 0;Arrays.sort(freq);for (int f : freq) {while (uniqueFreq.contains(f) && f > 0) {f--;}if (f > 0) {sum += f;uniqueFreq.add(f);}}return s.length() - sum;}
}
后来我又试了一下,这里对于长为26的频率数组是否排序完全不影响结果,因为如果有多个相同频率的字符,对于结果没有影响,结果只是问长度,而不是问具体删减之后的字符串长啥样,这有点像之前的找最大公共子串,只是问长度,没问具体子串是啥,当然这个我会,后面记得填坑。
回过来,虽然排序不影响结果,但是我一开始写的时候对于怎么给int[]数组降序排序折腾了半天,Arrays.sort(int[]) 后面没法传入Collections.reverseOrder(),所以要么直接sort之后反过来,要么用Integer[]数组之后用Arrays.sort(a, Collections.reverseOrder()),注意这样的话要循环初始化每一位,不然每一位是空指针。
leetcode 1647相关推荐
- LeetCode 1647. 字符频次唯一的最小删除次数(贪心)
文章目录 1. 题目 2. 解题 1. 题目 如果字符串 s 中 不存在 两个不同字符 频次 相同的情况,就称 s 是 优质字符串 . 给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最 ...
- Leetcode 1647. Minimum Deletions to Make Character Frequencies Unique
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 1. Description 2. Solution **解析:**Version 1,先用字典统计每个英文字符出 ...
- Leetcode 1647. Minimum Deletions to Make Character Frequencies Unique [Python]
遇到frequency一样的,一直减1,直到次frequency是唯一的时候,存入字典. class Solution:def minDeletions(self, s: str) -> int ...
- 2021-07-01 Leetcode题解:545,915,1647,722
545. Boundary of Binary Tree 题目:Recursion 给定一个树形结构,返回 [ 根节点,左边界(为一个list),从左到右的所有叶子结点,及反序右边界] 的concat ...
- leetcode 周赛214 学习笔记(5561、1647)
5561. 获取生成数组中的最大值 问题描述:传送门 思路: 1.vector容器规划大小,通过与运算判断奇偶,递归,最后利用max函数求最值. 代码: class Solution {public: ...
- LeetCode题解(1647):字符频次唯一的最小删除次数(Python)
题目:原题链接(中等) 标签:贪心算法.排序 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 132m ...
- [LeetCode]135.Candy
[题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...
- 【LeetCode】(55)Jump Game(Medium)
题目 Jump Game Total Accepted: 52275 Total Submissions: 194395My Submissions Question Solution Given ...
- LeetCode之Candy
[题目] There areNchildren standing in a line. Each child is assigned a rating value. You are giving ca ...
最新文章
- 华为三层交换机(5328)DHCP中继应用配置实例
- 网站建设需要抠好每一个细节
- electron node 版本不匹配的解决细节
- Visual Studio 2015 RC中的ASP.NET新特性和问题修正
- Windows数据类型
- 华为OS操作系统,最早今秋面世!
- c++知识点(高级)
- linux 时间校准
- 都是做游戏,为嘛国内外出来的产品相差这么大?
- Unity中实现使用Gizmo绘制出攻击范围
- windows开机启动自定义程序和任务
- 线性代数之矩阵的秩(2)
- 行业大数据应用-复习
- TPM 2.0规范系列解读——Part 1体系结构第(三)读:可信平台的基本特征
- @Transactional又双叒叕失效了?
- 【化学信息学】药物研发的过程和意义
- 如何用命令启用计算机用户,win10启用administrator账户的步骤_如何在win10下启用administrator用户...
- 关于Android高德地图路线导航的学习
- Hadoop教程免费视频 小象《Hadoop 2.X大数据平台V3》
- for循环一定要指定键么 vue_Vue.JS v-for循环后,想要实现每个单独项实现单独的show的true\false...