编程经验分享(寻找map中的max与min)——力扣·百战炼磨(一)

本文介绍了在LeetCode题目中,如何优化寻找字符串子串的'美丽值',即最大频率字符与最小频率字符差值的总和。通过对比作者的初始代码和力扣用户Hanxin的高效解法,分析了使用unordered_map来查找最大值和最小值的优化策略,从而避免超时问题,提升了编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2021/4/14

力扣第47场双周赛——虚拟竞赛

第三题 所有子字符串美丽值之和

力扣 1781

以下经验来自于对该题目的解决:

一个字符串的 美丽值 定义为:出现频率最高字符与出现频率最低字符的出现次数之差。

比方说,“abaacc” 的美丽值为 3 - 1 = 2 。 给你一个字符串 s ,请你返回它所有子字符串的 美丽值 之和。

示例 1:

输入:s = “aabcb” 输出:5 解释:美丽值不为零的字符串包括
[“aab”,“aabc”,“aabcb”,“abcb”,“bcb”] ,每一个字符串的美丽值都为 1 。 示例 2:

输入:s = “aabcbaa” 输出:17

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-beauty-of-all-substrings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本体目标在于对每个可能的子字符串进行一次“美丽值”的查找,而所需解决的关键点在于如何优化寻找使其不超时。

以下是我对“美丽值”的查找函数,是一段很弱智的查找方式
是一段很简朴,很入门的查找方式

for(int i=left;i<=right;i++){
	if(hash[s[i]]>Max)Max=hash[s[i]];
	if(hash[s[i]]<Min)Min=hash[s[i]];
}

但很不幸的是我的 弱智 简朴代码没能通过,它超时了。

在这种情况下我前往原题寻找解决方案,发现了力扣用户Hanxin的解题代码。

以下是力扣用户Hanxin的解题代码。

class Solution { public:
int beautySum(string s)
{
int n = s.size();
int res = 0;
for (int L = 0; L < n; L ++)
{
unordered_map<char, int> dic;
for (int R = L; R < n; R ++)
{
dic[s[R]] ++;
if (dic.size() > 0)
{
int min_ = 0x3f3f3f3f;
int max_ = -0x3f3f3f3f;
for (auto [c, freq]: dic)
{
min_ = min(min_, freq);
max_ = max(max_, freq);
}
res += (max_ - min_);
}
}
}
return res;
} };

作者:Hanxin_Hanxin
链接:https://leetcode-cn.com/problems/sum-of-beauty-of-all-substrings/solution/c-python3-ha-xi-zi-dian-tong-ji-bi-jiao-ypqor/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

他的代码和我的代码之间的核心区别在于寻找的方式,他的明显更高效,借此机会我也提升了自己的编程能力(Exp++)

for(auto [c,freq]:hash){
	if(freq>Max)Max=freq;
	if(freq<Min)Min=freq;
}

恭喜看到这里的你掌握了一种map的搜寻方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值