LeetCode1221.分割平衡字符串&1894.找到需要补充粉笔的学生编号(C++)
前言
一个普通解法的简单题LeetCode1221.分割平衡字符串
一个普通解法的中等题LeetCode1894.找到需要补充粉笔的学生编号
LeetCode1221.分割平衡字符串
点击链接开始刷题φ(゜▽゜*)♪:LeetCode1221.分割平衡字符串
解题思路
直接遍历字符串
遇到 R,就使 r 计数加一;
遇到 L,就使 l 计数加一;
当 r==l 的时候,说明出现了一个 R 和 L 数量相等的子串,可以把它分割出去,
所以使 count 计数加一,并且使 r 和 l 重新归 0,进行下一轮的计数;
最后 count 的值就是可以通过分割得到的平衡字符串的最大数量。
代码
class Solution {
public:
int balancedStringSplit(string s) {
int count = 0; //可以通过分割得到的平衡字符串的最大数量
int r = 0; //R的数量
int l = 0; //L的数量
for(int i=0;i<s.size();++i){
if(s[i]=='R')
++r;
else if(s[i]=='L')
++l;
if(r==l){
r = 0;
l = 0;
++count;
}
}
return count;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)
LeetCode1894.找到需要补充粉笔的学生编号
点击链接开始刷题φ(゜▽゜*)♪:LeetCode1894.找到需要补充粉笔的学生编号
解题思路
因为老师是一直重复这个过程的,可能会有很多很多轮回,直到粉笔不够
所以先遍历一遍数组 chalk,把一轮下来学生需要的粉笔总数算出来
然后将 k 对 sum 进行取模
就会得到最后一轮开始时还剩余的粉笔数量
这些粉笔一定会在这最后一轮消耗完毕
所以只要再遍历一次数组 chalk
每次 k 都减去 chalk[i],直到 k<chalk[i],则返回 i
因为粉笔一定会在最后一轮消耗完,所以必然是从 return i 处结束这个函数
根本不会执行到 return 0 这一行,所以写 return -1 啥的也行~
代码
class Solution {
public:
int chalkReplacer(vector<int>& chalk, int k) {
int len = chalk.size();
long sum = 0;
for(int i=0;i<len;++i){
sum += chalk[i];
}
k = (int)k%sum; //取模
for(int i=0;i<len;++i){
if(k<chalk[i])
return i; //最后肯定是从这里返回结果
k -= chalk[i];
}
return 0; //不会执行到这里
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(1)