题目来源于知识星球—英雄算法联盟,五月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、1221.分割平衡字符串(简单)
1.题目描述
2.解题思路
因为题意要求分割得到的字符串必须是原字符串的连续子串,所以用t来衡量,ch为
R时t++,为L时t--,当t=0时即为平衡子串,cnt++。
3.代码演示(C++)
class Solution
{
public:
int balancedStringSplit(string s)
{
int r=0;
int l=0;
int cnt=0;
for(int i=0;i<s.length();i++)
{
if(s[i]=='R')
{
r++;
}
else
{
l++;
}
if(r==l)
{
cnt++;
}
}
return cnt;
}
};
4.题目链接
二、1827.最少操作使数组递增(简单)
1.题目描述
2.解题思路
从数组第二个数开始遍历数组,判断当前数比前一个数小或者等于则不满足单调递
增,将当前nums[i]操作(nums[i-1]-nums[i]+1)次记录并更新nums[i]。
3.代码演示(C++)
class Solution
{
public:
int minOperations(vector<int>& nums)
{
int ans = 0;
// 1. 从数组第二个数开始遍历数组
for (int i = 1; i < nums.size(); ++i)
{
// 2. 判断当前数比前一个数小或者等于不满足单调递增
if(nums[i] <= nums[i-1]) {
// 3. 将当前num[i]操作(nums[i-1]-nums[i]+1)次记录并更新nums[i]
ans += nums[i-1] - nums[i] + 1;
nums[i] = nums[i-1] + 1;
}
}
return ans;
}
};
4.题目链接
三、2144.打折购买糖果的最小开销(简单)
1.题目描述
2.解题思路
对数组cost进行降序排列,每次将前两个相加,跳过第三个。
3.代码演示(C++)
class Solution
{
public:
int minimumCost(vector<int>& cost)
{
int sum=0;
sort(cost.begin(),cost.end(),greater<int>());//对数组cost进行逆序排列
int temp=0;
for(int i=0;i<cost.size();i++)
{//每次将前两个相加,跳过第三个
temp++;
if(temp==3)
{
temp=0;
continue;
}
sum+=cost[i];
}
return sum;
}
};
4.题目链接
四、1400.构造k个回文字符串(中等)
1.题目描述
2.解题思路
所有的偶数字符对都是可以构造回文字符串的,而奇数字符对都是不可构造的。
能构造最多的回文字符串的个数为2*偶数字符对+奇数字符对(2Dcnt+Ocnt),
最少回文字符串的个数为奇数字符串(Ocnt)。
当k>=Ocnt&&k<=2*Dcnt+Ocnt时返回true,否则返回false。
3.代码演示(C++)
class Solution
{
public:
bool canConstruct(string s, int k)
{
int hash[26];
int Dcnt=0;
int Ocnt=0;
memset(hash,0,sizeof(hash));
for(char c:s)
{
hash[c-'a']++;
}
for(int i=0;i<26;i++)
{
Dcnt+=hash[i]/2;
Ocnt+=hash[i]%2;
}
if(k<=2*Dcnt+Ocnt&&k>=Ocnt)
{
return true;
}
return false;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!