题目来源于知识星球—英雄算法联盟,五月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、1984.学生分数的最小差值(简单)
1.题目描述
2.解题思路
先对数组进行升序排列,然后让数组下标维持在i~i+k-1长度为k的窗口滑动,在此
区间中最大值为nums[i+k-1],最小值为nums[i],不断更新最小值。
3.代码演示(C++)
class Solution
{
public:
int minimumDifference(vector<int>& nums, int k)
{
int sum=999999;
sort(nums.begin(),nums.end());
for(int i=0;i+k-1<nums.size();i++)
{
sum=min(nums[i+k-1]-nums[i],sum);
}
return sum;
}
};
4.题目链接
二、1876.长度为三且各字符不同的子字符串(简单)
1.题目描述
2.解题思路
根据题意,只需要找到长度为3的连续子字符串并且该字符串中没有任何重复字符,
则计数器++。
3.代码演示(C++)
class Solution
{
public:
int countGoodSubstrings(string s)
{
int cnt=0;
for(int i=0;i+2<s.size();i++)
{
if(s[i]!=s[i+1]&&s[i]!=s[i+2]&&s[i+1]!=s[i+2])
{
cnt++;
}
}
return cnt;
}
};
4.题目链接
三、1839.所有元音按顺序排布的最长字符串(中等)
1.题目描述
2.解题思路
1.首先如果数组长度小于5,不满足美丽的定义,排除;
2.在遍历时需要分情况判断:
如果当前字符比前一个字符不小,子串长度+1;如果当前字符比前一个字符大,子串
中元音字母种类+1;如果当前字符比前一个字符小,不符合题意,以当前字符为首继
续进行遍历。
3.如果当前字符串没有以a开头,元音种类一定小于5,因此只要判断元音字母种类
即可;
4.当元音种类为5时,持续维护更新结果,找到最大值。
3.代码演示(C++)
class Solution
{
public:
int longestBeautifulSubstring(string word)
{
if(word.size()<5)
{
return 0;
}
int ans=0;
int len=1;//字符串长度
int var=1;//字母的种类
for(int i=1;i<word.size();i++)
{
if(word[i]>=word[i-1])
{
len++;
}
if(word[i]>word[i-1])
{
var++;
}
if(word[i]<word[i-1])
{
len=1;
var=1;
}
if(var==5)
{
ans=max(ans,len);
}
}
return ans;
}
};
4.题目链接
四、1052.爱生气的书店老板(中等)
1.题目描述
2.解题思路
代码来源于LeetCode官方题解,后续仍需加强理解与学习。
3.代码演示(C++)
class Solution
{
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes)
{
int total = 0;
int n = customers.size();
for (int i = 0; i < n; i++) {
if (grumpy[i] == 0) {
total += customers[i];
}
}
int increase = 0;
for (int i = 0; i < minutes; i++) {
increase += customers[i] * grumpy[i];
}
int maxIncrease = increase;
for (int i = minutes; i < n; i++) {
increase = increase - customers[i - minutes] * grumpy[i - minutes] + customers[i] * grumpy[i];
maxIncrease = max(maxIncrease, increase);
}
return total + maxIncrease;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!