lc1989
喵喵的双指针标记 遍历
遇1就找其dist范围内未用的0,找到就计数且0指针后移
++while(z<n && team[z]!=0 || z<l)++
z++;//找到了 后移 不可重复使用
最终得最多可匹配人数
class Solution
{
//双指针,针对每个点,按照范围去找能覆盖的0的位置
//同时维持0的位置,不断右移直到满足位置
public:
int catchMaximumAmountofPeople(vector<int>& team, int dist)
{
int n=team.size();
vector<bool> vis(n);
int ret=0,z=0;//z 指针模拟0可选的位置
for(int i=0;i<n;i++)
{
if(team[i]==1){
int l=max(0,i-dist);
int r=min(n-1,i+dist);
++while(z<n && team[z]!=0 || z<l)++
z++;
if(z<=r)
{
ret++;
++z++;//找到了 后移 不可重复使用++
}
}
}
return ret;
}
};
lc555
先把字符串换成自身或反转后的较大值
遍历每个字符串,拆分后拼接其他所有字符串,取最大拼接结果。
class Solution {
public:
string splitLoopedString(vector<string>& strs) {
int n=strs.size();
for(int i=0;i<n;i++){
string tmp{strs[i].rbegin(),strs[i].rend()};
if(tmp>strs[i])strs[i]=tmp;
}
string ans="";
for(int i=0;i<n;i++){
string other="";
string str=strs[i];
string rev={str.rbegin(),str.rend()};
++for(int j=i+1;j<n;j++)
other+=strs[j]; //之后
for(int j=0;j<i;j++)
other+=strs[j]; //之前++
for(int k=0;k<str.size();k++)
{
string ++cur=str.substr(k)+other+str.substr(0,k);++
if(cur>ans)ans=cur;
}
for(int k=0;k<rev.size();k++){
string cur=rev.substr(k)+other+rev.substr(0,k);
if(cur>ans)ans=cur;
}
}
return ans;
}
};
lc3540
先算++正反向路径的前缀和,遍历查询++
按当前与前一位置的先后,取++正向直达或反向绕行的最小时间累加++,得总耗时
class Solution {
public:
typedef long long ll;
long long minTotalTime(vector<int>& forward, vector<int>& backward, vector<int>& queries) {
int len = forward.size();
vector<ll> f(2 * len), b(2 * len);
const int mod = len;
for(int i = 1; i < 2 * len; i++) {
f[i] = f[i - 1] + forward[(i - 1) % mod];
b[i] = b[i - 1] + backward[(i - 1) % mod];
}
ll ret = 0;
int pre = 0;
for(int cur : queries) {
++ret += min(f[cur > pre ? cur : cur + mod] - f[pre],
b[(cur < pre ? pre : pre + mod) + 1] - b[cur + 1]);++
pre = cur;
}
return ret;
}
};
lc333
tiii dfs
return前 ok check sz&update
dfs 遍历树,每个节点记录子树最值和BST节点数(-1非BST)
验证当前节点为根的子树是否BST,实时更最大BST节点数
class Solution {
int ans = 0;
using T = tuple<int, int, int>;
public:
int largestBSTSubtree(TreeNode* root) {
if (!root) return 0;
dfs(root);
return ans;
}
T dfs(TreeNode* n)
{
int mn = n->val, mx = n->val;
int ls = 0, rs = 0;
bool ok = true;
if (n->left) {
auto [lm, lx, lz] = dfs(n->left);
if (lz == -1 || n->val <= lx) ok = false;
mn = min(mn, lm);
mx = max(mx, lx);
ls = lz;
}
if (n->right) {
auto [rm, rx, rz] = dfs(n->right);
if (rz == -1 || n->val >= rm) ok = false;
mn = min(mn, rm);
mx = max(mx, rx);
rs = rz;
}
int sz = ok ? (1 + ls + rs) : -1;
if (sz != -1) ans = max(ans, sz);
return {mn, mx, sz};
}
};