贪心算法解决跳跃游戏II问题及Java实现
2026/9/11 0:21:41
这道题看起来很简单:
统计字符出现次数,然后按次数排序。
但如果你真在工程里做过类似的事,比如:
你会发现这类问题的核心,其实是「频率统计 + 排序策略」。
LeetCode 451 正好是一个非常干净、非常标准的模板题,非常适合用来练:
题目给你一个字符串s,要求你:
需要注意的几个点:
5 * 10^5这道题的解法其实非常清晰,可以拆成三步:
遍历字符串,用一个字典:
[Character:Int]来记录每个字符出现的次数。
把字典转成数组:
[(Character,Int)]然后按value(出现次数)做降序排序。
排序完成后,按顺序把字符重复count次,拼接成最终字符串。
下面是完整、可直接运行的 Swift 实现:
classSolution{funcfrequencySort(_s:String)->String{// 1. 统计字符频率varfreq:[Character:Int]=[:]forchins{freq[ch,default:0]+=1}// 2. 按出现次数降序排序letsorted=freq.sorted{$0.value>$1.value}// 3. 构造结果字符串varresult=""for(ch,count)insorted{result+=String(repeating:ch,count:count)}returnresult}}varfreq:[Character:Int]=[:]这是最自然、也最直观的方式:
key是字符value是出现次数Swift 的Dictionary对这种计数场景支持得非常友好。
letsorted=freq.sorted{$0.value>$1.value}sorted之后的数据结构其实是:
[(Character,Int)]也就是一个(字符, 次数)的数组。
排序规则很简单:
因为:
混在一起只会让逻辑变复杂,不会更快。
result+=String(repeating:ch,count:count)这一步非常直观:
同时也满足了题目「相同字母必须放在一起」的要求。
letsolution=Solution()print(solution.frequencySort("tree"))输出可能是:
eert或者:
eetr都是正确结果。
print(solution.frequencySort("cccaaa"))输出:
cccaaa或者:
aaacccprint(solution.frequencySort("Aabb"))输出:
bbAa注意这里:
'A'和'a'是不同字符这道题的模式在实际开发中非常常见,比如:
把这套逻辑稍微改一下,就可以变成:
O(n)O(k log k)O(n)总体时间复杂度:
O(n + k log k)在实际情况下,k通常远小于n。
O(k)O(k)O(n)空间复杂度:
O(n + k)LeetCode 451 是一道非常「工程友好」的题: