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

}

};

相关推荐
求梦8204 分钟前
【力扣hot100题】缺失的第一个正数(12)
数据结构·算法·leetcode
散峰而望20 分钟前
【算法竞赛】顺序表和vector
c语言·开发语言·数据结构·c++·人工智能·算法·github
千金裘换酒21 分钟前
LeetCode 回文链表
算法·leetcode·链表
CSDN_RTKLIB21 分钟前
【std::map】与std::unordered_map差异
算法·stl·哈希算法
FL1717131422 分钟前
Geometric Control
人工智能·算法
老鼠只爱大米25 分钟前
LeetCode算法题详解 283:移动零
算法·leetcode·双指针·快慢指针·移动零·move zeroes
过河卒_zh156676629 分钟前
喜讯:第十五批生成合成类算法备案备案号公布
人工智能·算法·aigc·生成式人工智能·算法备案
cpp_250133 分钟前
B3927 [GESP202312 四级] 小杨的字典
数据结构·c++·算法·题解·洛谷
Cx330❀36 分钟前
《C++ 递归、搜索与回溯》第2-3题:合并两个有序链表,反转链表
开发语言·数据结构·c++·算法·链表·面试
AI科技星37 分钟前
电磁耦合常数Z‘的第一性原理推导与严格验证:张祥前统一场论的几何基石
服务器·人工智能·线性代数·算法·矩阵