leetcode 451.根据字符出现频率排序

一、题目

给定一个字符串,请将字符串里的字符按照出现的频率降序排列
输入

"tree"

输出

"eert"

二、解法

2.1 桶排序

解题思路:本题也可用其他思路,诸如优先队列和大根堆来对频率进行合适的排序。相比较桶排序时间复杂度更优。统计每个字符出现的频率,建立以频率大小为索引的桶,存放相对应的字符。最后由出现频率大到小的桶进行遍历输出 ,得到最终结果。

class Solution {
public:
    string frequencySort(string s) {
        unordered_map<char, int> counts;  // 统计字符以及其出现的次数
        int max_count = 0;  // 单词最大统计次数
        for (auto i : s) {
            max_count = max(max_count, ++counts[i]);
        }
        vector<vector<int>> buckets(max_count+1);
        for (auto count : counts) {
            buckets[count.second].push_back(count.first);  // 每个桶代表单词出现的频率
        }

        string ans;
        for (int i = max_count; i >= 0; --i) {  // 从频率大的桶开始输出
            for (auto buc: buckets[i]) {
                int counts = i;  // 保证字符输出合适的频率个数
                while (--counts >= 0)
                    ans.push_back(buc);
            }
        }
        return ans;
    }
};

复杂度分析

  • 时间复杂度:时间复杂度:O(n + k),其中 n是字符串 s 的长度,kk 是字符串 s包含的不同字符的个数。遍历字符串统计每个字符出现的频率需要 O(n)的时间。创建桶并将不同字符加入桶需要 O(k) 的时间。生成排序后的字符串,需要 O(k)的时间遍历桶,以及 O(n)的时拼接字符串间,因此总时间复杂度是 O(n + k)
  • 空间复杂度:O(n+k),其中 n 是字符串 s 的长度,k 是字符串 s 包含的不同字符的个数。空间复杂度主要取决于桶和生成的排序后的字符串。

你可能感兴趣的:(Leetcode,数据结构,算法,leetcode)