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

}

};

相关推荐
拉姆哥的小屋2 小时前
基于Benders分解的大规模两阶段随机优化算法实战:从理论到工程实践的完整解决方案
人工智能·算法·机器学习
鹿角片ljp3 小时前
力扣144.二叉树前序遍历-递归和迭代
算法·leetcode·职场和发展
好易学·数据结构3 小时前
可视化图解算法73:跳台阶(爬楼梯)
数据结构·算法·leetcode·动态规划·笔试
Salt_07283 小时前
DAY32 类的定义和方法
开发语言·python·算法·机器学习
Tisfy3 小时前
LeetCode 3433.统计用户被提及情况:(大)模拟
linux·算法·leetcode
一招定胜负3 小时前
逻辑回归核心原理与实践指南
算法·逻辑回归·线性回归
长安er3 小时前
LeetCode 98. 验证二叉搜索树 解题总结
java·数据结构·算法·leetcode·二叉树·力扣
薛不痒3 小时前
机器学习算法之线性回归&逻辑回归
算法·机器学习·逻辑回归
sin_hielo3 小时前
leetcode 3433
数据结构·算法·leetcode