解题报告
学生分数的最小差值
题目链接:1984. 学生分数的最小差值
解题思路
将分数排序,滑动窗口的大小为k,向后遍历最大最小分数的差值,取最小值
class Solution {
public:
int minimumDifference(vector<int>& nums, int k) {
int n = nums.size();
sort(nums.begin(), nums.end());
int l = 0, r = k - 1, minSub = 100000;
for(; r < n; l ++ ,r ++ ){
minSub = min(minSub, nums[r] - nums[l]);
}
return minSub;
}
};
长度为三且各字符不同的子字符串
解题思路
长度为3的滑动窗口遍历数组,每遍历三个字符,用哈希数组记录每个字符出现的个数,如果每个字符出现的次数都不大于1,则答案 +1。
class Solution {
public:
int countGoodSubstrings(string s) {
int n = s.size();
int ans = 0, flag = 0;
for(int i = 0; i < n - 2; i ++ ){
int hash[30] = {0};
flag = 0;
for(int j = i; j < i + 3; j ++ ){
if(!hash[s[j] - 'a'])
hash[s[j] - 'a'] ++ ;
else
flag = 1;
}
if(!flag)
ans ++ ;
}
return ans;
}
};
所有元音按顺序排布的最长子字符串
解题思路
两个指针,
l
确定子串的起始位置,r
向右遍历。
(1)当后一个字符大于前一个字符,r 向右走一步。
(2)用一个计数器记录子串不同字符的数量,只有子串包含5个元音字符才符合条件,若不满足5个,计数器不会增到5。
(3)当子串满足第一个字符为’a’,最后一个字符为’u’且包含5个元音字符,则找到一个符合的子串。
(4)分割之前的子串,继续向后遍历。
class Solution {
public:
int longestBeautifulSubstring(string word) {
int n = word.size();
int l = 0, r = 1, maxlen = 0, num;
while(r < n){
num = 1;
while(r < n && word[r] >= word[r - 1]){ //(1)
if(word[r] > word[r - 1]) //(2)
num ++ ;
r ++ ;
}
if(word[l] == 'a' && word[r - 1] == 'u' && num == 5) //(3)
maxlen = max(maxlen, r - l);
l = r; //(4)
r ++ ;
}
return maxlen;
}
};
爱生气的书店老板
题目链接:1052. 爱生气的书店老板
解题思路
分为两个部分,第一部分求一定会满意的顾客人数,第二部分求在minutes分钟内可以额外增加的最大的人数,两个结果相加即为最终答案。
(1)求一定会满意的人数,即加上所有老板不生气时的到店人数。
(2)当前不满意的人数。
(3)当遍历的窗口大小等于minutes,得到当前minutes窗口内可以额外增加的人数,取最大值,窗口继续向后遍历,l ++ 。
(4)最终答案两个部分相加。
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
int n = customers.size();
int l = 0, r = 0, ans = 0, extra = 0;
for(int i = 0; i < n; i ++ ){ //(1)
if(grumpy[i] == 0)
ans += customers[i];
}
int tmp = 0;
while(r < n){
tmp += customers[r] * grumpy[r]; //(2)
r ++ ;
if(r - l == minutes){ //(3)
extra = max(extra, tmp);
tmp -= customers[l] * grumpy[l];
l ++ ;
}
}
ans += extra; //(4)
return ans;
}
};