• Leetcode 451. Sort Characters By Frequency (用堆)


    1. Sort Characters By Frequency
      Medium

    Given a string s, sort it in decreasing order based on the frequency of the characters. The frequency of a character is the number of times it appears in the string.

    Return the sorted string. If there are multiple answers, return any of them.

    Example 1:

    Input: s = “tree”
    Output: “eert”
    Explanation: ‘e’ appears twice while ‘r’ and ‘t’ both appear once.
    So ‘e’ must appear before both ‘r’ and ‘t’. Therefore “eetr” is also a valid answer.
    Example 2:

    Input: s = “cccaaa”
    Output: “aaaccc”
    Explanation: Both ‘c’ and ‘a’ appear three times, so both “cccaaa” and “aaaccc” are valid answers.
    Note that “cacaca” is incorrect, as the same characters must be together.
    Example 3:

    Input: s = “Aabb”
    Output: “bbAa”
    Explanation: “bbaA” is also a valid answer, but “Aabb” is incorrect.
    Note that ‘A’ and ‘a’ are treated as two different characters.

    Constraints:

    1 <= s.length <= 5 * 105
    s consists of uppercase and lowercase English letters and digits.

    解法1:

    class Solution {
    public:
        string frequencySort(string s) {
            priority_queue<pair<int, char>> maxHeap;
            unordered_map<char, int> mp;
            for (auto c : s) mp[c]++;
            for (auto m : mp) {
                maxHeap.push({m.second, m.first});
            }
            string res = "";
            while (!maxHeap.empty()) {
                auto top = maxHeap.top();
                maxHeap.pop();
                for (int i = 0; i < top.first; i++) res += top.second;   //注意不要写成res = res + top.second; 不然内存不够
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    解法2:

    struct Node {
        char ch;
        int freq;
        Node(char c, int f) : ch(c), freq(f) {}
        bool operator < (const Node & n) const {
            return freq < n.freq;
        }
    };
    
    class Solution {
    public:
        string frequencySort(string s) {
            int n = s.size();
            priority_queue<Node> maxHeap;
            unordered_map<char, int> char2Freq;
            for (auto c : s) {
                char2Freq[c]++;
            }
            for (auto cf : char2Freq) {
                maxHeap.push(Node(cf.first, cf.second));
            }
            string res = "";
            while (!maxHeap.empty()) {
                Node top = maxHeap.top();
                maxHeap.pop();
                for (int i = 0; i < top.freq; i++) res += top.ch; //注意不要写成res = res + top.second; 不然内存不够
            }
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    linux嵌入式开发所用工具
    Android开发之线程间通信
    最新版本 Stable Diffusion 开源 AI 绘画工具之中文自动提词篇
    牛客小白月赛55
    基于Lumisoft.NET组件,使用IMAP协议收取邮件
    zKSync 2.0 新特征解析
    PWM实验
    消息中间件-kafka实战-第四章-kafkaUI
    单点登录原理及实现方式
    阿里 P9 架构师力荐:Java 面试必刷的 17 套一线大厂真题(含答案)
  • 原文地址:https://blog.csdn.net/roufoo/article/details/133822593