Easy
题目描述
给你一个字符串 s。模拟每一秒 i 的事件:
- 如果
s[i] == 'E',一个人进入候车室并坐在其中一张椅子上。 - 如果
s[i] == 'L',一个人离开候车室,释放一张椅子。
返回所需的最少椅子数,使得每个进入候车室的人都能有椅子坐,假设候车室最初是空的。
示例 1:
输入:s = "EEEEEEE"
输出:7
解释:
每一秒都有一个人进入候车室,没有人离开。因此,至少需要 7 张椅子。
示例 2:
输入:s = "ELELEEL"
输出:2
解释:
考虑候车室有 2 张椅子。下表显示了每一秒候车室的状态。
示例 3:
输入:s = "ELEELEELLL"
输出:3
解释:
考虑候车室有 3 张椅子。下表显示了每一秒候车室的状态。
约束条件:
1 <= s.length <= 50s只包含字母 ‘E’ 和 ‘L’s代表一个有效的进入和离开序列
提示:
- 从左到右遍历字符串,使用一个变量跟踪候车室中的人数,遇到 ‘E’ 就递增,遇到 ‘L’ 就递减。
- 答案是任何时刻候车室中的最大人数。
解题思路
这是一道模拟题,核心思想是跟踪候车室中人数的变化并记录峰值。
解题思路:
模拟过程:遍历字符串,维护当前候车室中的人数
- 遇到 ‘E’:有人进入,人数 +1
- 遇到 ‘L’:有人离开,人数 -1
记录最大值:在模拟过程中,实时更新并记录候车室中人数的最大值,这个最大值就是所需的最少椅子数
关键洞察:由于每个进入的人都需要一张椅子,所需椅子数等于同时在候车室中的最大人数。当人数达到峰值时,就是椅子需求最大的时刻。
算法步骤:
- 初始化当前人数为 0,最大人数为 0
- 遍历字符串的每个字符
- 根据字符更新当前人数
- 更新最大人数记录
- 返回最大人数
时间复杂度为 O(n),空间复杂度为 O(1),是最优解法。
代码实现
class Solution {
public:
int minimumChairs(string s) {
int current = 0, maxChairs = 0;
for (char c : s) {
if (c == 'E') {
current++;
maxChairs = max(maxChairs, current);
} else {
current--;
}
}
return maxChairs;
}
};
class Solution:
def minimumChairs(self, s: str) -> int:
current = 0
max_chairs = 0
for c in s:
if c == 'E':
current += 1
max_chairs = max(max_chairs, current)
else:
current -= 1
return max_chairs
public class Solution {
public int MinimumChairs(string s) {
int current = 0, maxChairs = 0;
foreach (char c in s) {
if (c == 'E') {
current++;
maxChairs = Math.Max(maxChairs, current);
} else {
current--;
}
}
return maxChairs;
}
}
var minimumChairs = function(s) {
let currentPeople = 0;
let maxChairs = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] === 'E') {
currentPeople++;
maxChairs = Math.max(maxChairs, currentPeople);
} else {
currentPeople--;
}
}
return maxChairs;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历字符串一次,其中 n 是字符串长度 |
| 空间复杂度 | O(1) | 只使用常数个变量存储当前人数和最大人数 |
相关题目
- . Consecutive Characters (Easy)