【贪心】个人练习-Leetcode-1647. Minimum Deletions to Make Character Frequencies Unique

题目链接:https://leetcode.cn/problems/minimum-deletions-to-make-character-frequencies-unique/description/

题目大意:给出一个字符串s,只包含小写字母。目标是【通过删除若干个字符】将其变为「每个字符出现的频次都不同」的字符串,求最小的删除字符数量。

思路:可以画一张柱状图,横坐标是出现频次,柱子的高度是这个出现频次的字符的个数。删除「n个」字符意味着将某根柱子高度-1,让其左边「n格」的柱子高度+1。最终目标是让所有柱子高度为1(但0频次可以有很多个,因为一个字符出现次数为0意味着删光了)。

很显然柱子的高度只能往左转移,那么从某根柱子开始向左找第一个高度为0的频次即可。不可能找不到,因为最终可以到达频次为0,也就是全删光。

用一个set记录高度大于1的柱子(频次,显然0除外),对它们进行贪心即可。

完整代码

cpp 复制代码
class Solution {
public:
    int minDeletions(string s) {
        int freq[100001] = {};
        int cnt[26] = {};

        for (auto c : s) {
            cnt[c-'a']++;
        }

        set<int> q;
        for (int i = 0; i < 26; i++) {
            if (cnt[i]) {
                freq[cnt[i]]++;
                if (freq[cnt[i]] > 1) {
                    q.insert(cnt[i]);
                }
            }
        }

        int ans = 0;
        for (auto it = q.begin(); it != q.end(); it++) {
            int idx = *it-1;
            while (freq[*it] > 1) {
                while (idx > 0 && freq[idx]) {
                    idx--;
                }
                freq[idx]++;
                freq[*it]--;
                ans += *it-idx;
            }
        }
        return ans;
    }
};
相关推荐
土司大王6 小时前
LeetCode hot100——对称二叉树
算法·leetcode·职场和发展
sali-tec7 小时前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
Navigator_Z7 小时前
LeetCode //C - 1208. Get Equal Substrings Within Budget
c语言·算法·leetcode
手写码匠7 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
黎阳之光7 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
大模型码小白7 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
sel_98 小时前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
Asize9 小时前
438. 找到字符串中所有字母异位词
算法
Asize9 小时前
283. 移动零
算法
船厂电气自动化ai大模型11 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习