滑窗|队列
lc648
双队列模拟_下标入队
问题:RDDR为什么结果是R,不应该一人禁一个然后平局吗
回答:
这是一个循环。第一个R把第一个D禁掉,第二个D再把第二个R禁掉,这样一次之后
实际上还剩下第一个R和第二个D,即RD,因此第二轮第一个R又会被第二个D禁掉
class Solution {
public:
string predictPartyVictory(string senate)
{
queue<int> r, d;
int n = senate.size();
for (int i = 0; i < n; ++i) {
if (senate[i] == 'R') r.emplace(i);
else d.emplace(i);
}
auto act = [&](queue<int>& q1, queue<int>& q2) {
q2.pop();
q1.emplace(q1.front() + n);
q1.pop();
};
while (!r.empty() && !d.empty()) {
if (r.front() < d.front()) act(r, d);
else act(d, r);
}
return r.empty() ? "Dire" : "Radiant";
}
};
lc1419
模拟_状态转移 思想
计算同时“呱叫”(按“croak”顺序发声)的最少青蛙数量

class Solution {
public:
int minNumberOfFrogs(string croakOfFrogs) {
char PREVIOUS['s']; // 's' 保证 "croak" 中的任意字符都不会越界
const string croak = "croakc";
for (int i = 1; i < croak.length(); i++) {
PREVIOUS[croak[i]] = croak[i - 1];
}
int cnt['s']{};
for (char ch: croakOfFrogs) {
char pre = PREVIOUS[ch]; // pre 为 ch 在 "croak" 中的上一个字母
if (cnt[pre]) { // 如果有青蛙发出了 pre 的声音
cnt[pre]--; // 复用一只
} else if (ch != 'c') { // 否则青蛙必须从 'c' 开始蛙鸣
return -1; // 不符合要求
}
cnt[ch]++; // 发出了 ch 的声音
}
if (cnt['c'] || cnt['r'] || cnt['o'] || cnt['a']) {
return -1; // 有发出其它声音的青蛙,不符合要求
}
return cnt['k']; // 没人消耗k~
}
};
lcr8
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums)
{
//target = 7, nums = [2,3,1,2,4,3]
int n=nums.size();
int l=0,r=0,ret=INT_MAX;
int sum=0;
if(target==0)
return 0;
while(r<n)
{
sum+=nums[r];
while(sum>=target)
{
ret=min(ret,r-l+1);
sum-=nums[l];
l++;
}
r++;
}
return ret==INT_MAX?0:ret;
}
};
