tree

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};

}

};

相关推荐
s1hiyu20 小时前
实时控制系统验证
开发语言·c++·算法
daad77720 小时前
V4L2_mipi-csi
算法
2301_7657031420 小时前
C++代码复杂度控制
开发语言·c++·算法
m0_7088309620 小时前
C++中的享元模式实战
开发语言·c++·算法
naruto_lnq20 小时前
分布式计算C++库
开发语言·c++·算法
m0_7066532321 小时前
模板编译期排序算法
开发语言·c++·算法
历程里程碑21 小时前
Linxu14 进程一
linux·c语言·开发语言·数据结构·c++·笔记·算法
木井巳21 小时前
【递归算法】验证二叉搜索树
java·算法·leetcode·深度优先·剪枝
m0_5613596721 小时前
嵌入式C++加密库
开发语言·c++·算法
近津薪荼21 小时前
优选算法——双指针专题7(单调性)
c++·学习·算法