这题就是先统计字符串里每个字符出现的频率,然后用一个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相关推荐

  1. LeetCode 1647. 字符频次唯一的最小删除次数(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 如果字符串 s 中 不存在 两个不同字符 频次 相同的情况,就称 s 是 优质字符串 . 给你一个字符串 s,返回使 s 成为 优质字符串 需要删除的 最 ...

  2. Leetcode 1647. Minimum Deletions to Make Character Frequencies Unique

    文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书 1. Description 2. Solution **解析:**Version 1,先用字典统计每个英文字符出 ...

  3. Leetcode 1647. Minimum Deletions to Make Character Frequencies Unique [Python]

    遇到frequency一样的,一直减1,直到次frequency是唯一的时候,存入字典. class Solution:def minDeletions(self, s: str) -> int ...

  4. 2021-07-01 Leetcode题解:545,915,1647,722

    545. Boundary of Binary Tree 题目:Recursion 给定一个树形结构,返回 [ 根节点,左边界(为一个list),从左到右的所有叶子结点,及反序右边界] 的concat ...

  5. leetcode 周赛214 学习笔记(5561、1647)

    5561. 获取生成数组中的最大值 问题描述:传送门 思路: 1.vector容器规划大小,通过与运算判断奇偶,递归,最后利用max函数求最值. 代码: class Solution {public: ...

  6. LeetCode题解(1647):字符频次唯一的最小删除次数(Python)

    题目:原题链接(中等) 标签:贪心算法.排序 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 132m ...

  7. [LeetCode]135.Candy

    [题目] There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  8. 【LeetCode】(55)Jump Game(Medium)

    题目 Jump Game Total Accepted: 52275 Total Submissions: 194395My Submissions Question  Solution  Given ...

  9. LeetCode之Candy

    [题目] There areNchildren standing in a line. Each child is assigned a rating value. You are giving ca ...

最新文章

  1. 华为三层交换机(5328)DHCP中继应用配置实例
  2. 网站建设需要抠好每一个细节
  3. electron node 版本不匹配的解决细节
  4. Visual Studio 2015 RC中的ASP.NET新特性和问题修正
  5. Windows数据类型
  6. 华为OS操作系统,最早今秋面世!
  7. c++知识点(高级)
  8. linux 时间校准
  9. 都是做游戏,为嘛国内外出来的产品相差这么大?
  10. Unity中实现使用Gizmo绘制出攻击范围
  11. windows开机启动自定义程序和任务
  12. 线性代数之矩阵的秩(2)
  13. 行业大数据应用-复习
  14. TPM 2.0规范系列解读——Part 1体系结构第(三)读:可信平台的基本特征
  15. @Transactional又双叒叕失效了?
  16. 【化学信息学】药物研发的过程和意义
  17. 如何用命令启用计算机用户,win10启用administrator账户的步骤_如何在win10下启用administrator用户...
  18. 关于Android高德地图路线导航的学习
  19. Hadoop教程免费视频 小象《Hadoop 2.X大数据平台V3》
  20. for循环一定要指定键么 vue_Vue.JS v-for循环后,想要实现每个单独项实现单独的show的true\false...

热门文章

  1. 关于实现手机定位,通过服务器,再发送给查询者,或指定人
  2. TwinCAT 3 气缸程序
  3. 《过得刚好》 郭德纲
  4. narak 靶机实验实战演练
  5. 爬虫入门经典(四) | 如何爬取豆瓣电影Top250
  6. 大数据之统计股票开盘和收盘平均价
  7. 入职B站一年,被裁员了,我思考了哪些?
  8. 开源量化框架Catalyst中文教程(3)——双均线策略
  9. C#画K线实现加载均线(5日,10日)
  10. springboot+dubbo+mybatis(注册中心使用的是zookeeper)学习