leetcode中等451根据字符出现频率排序
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等451根据字符出现频率排序相关的知识,希望对你有一定的参考价值。
思路:桶排序
- 遍历字符串,统计每个字符出现的频率,同时记录最高频率 maxFreq;
- 创建桶,存储从 1 到 maxFreq 的每个出现频率的字符;
- 按照出现频率从大到小的顺序遍历桶,对于每个出现频率,获得对应的字符,然后将每个字符按照出现频率拼接到排序后的字符串。
时间复杂度:O(n + k)
,其中 n 是字符串 s 的长度,k 是字符串 s 包含的不同字符的个数。
遍历字符串统计每个字符出现的频率需要 O(n) 的时间。
创建桶并将不同字符加入桶需要 O(k) 的时间。
生成排序后的字符串,需要 O(k) 的时间遍历桶,以及 O(n) 的时拼接字符串间。
因此总时间复杂度是 O(n + k)。
空间复杂度:O(n + k)
,其中 n 是字符串 s 的长度,k 是字符串 s 包含的不同字符的个数。空间复杂度主要取决于桶和生成的排序后的字符串。
class Solution
public String frequencySort(String s)
Map<Character, Integer> map = new HashMap<Character, Integer>();
int maxFreq = 0;
int length = s.length();
for (int i = 0; i < length; i++)
char c = s.charAt(i);
int frequency = map.getOrDefault(c, 0) + 1;
map.put(c, frequency);
maxFreq = Math.max(maxFreq, frequency);
StringBuffer[] buckets = new StringBuffer[maxFreq + 1];
for (int i = 0; i <= maxFreq; i++)
buckets[i] = new StringBuffer();
for (Map.Entry<Character, Integer> entry : map.entrySet())
char c = entry.getKey();
int frequency = entry.getValue();
buckets[frequency].append(c);
StringBuffer sb = new StringBuffer();
for (int i = maxFreq; i > 0; i--)
StringBuffer bucket = buckets[i];
int size = bucket.length();
for (int j = 0; j < size; j++)
for (int k = 0; k < i; k++)
sb.append(bucket.charAt(j));
return sb.toString();
以上是关于leetcode中等451根据字符出现频率排序的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Algorithm 451. 根据字符出现频率排序