dfs|bfs建图|hash贪心

lc128

o(n)不排序 hash空间换时间 贪心的写

class Solution {

public:

int longestConsecutive(vector<int>& nums) {

unordered_set<int> st(nums.begin(), nums.end());

int ans = 0;

for (int x : st) {

++if (st.contains(x - 1))++

++continue;++

// x 是序列的起点

int y = x + 1;

++while (st.contains(y))++

++y++;++

// y-1 是最后一个在哈希集合中的数

ans = max(ans, y - x);

// 从 x 到 y-1 一共 y-x 个数

}

return ans;

}

};

lc2943

排序后遍历计算横竖杆的最大连续长度,取两者min+1作为ret正方形的边长

++if (a[i] == a[i-1] + 1) cl++;
else cl = 1;
ml = max(ml, cl);
++

class Solution {

public:

int maximizeSquareHoleArea(int n, int m, vector<int>& hBars, vector<int>& vBars)

{

auto f = [](vector<int>& a) -> int {

if (a.empty()) return 0;

int ml = 1, cl = 1;

for (int i = 1; i < a.size(); ++i) {

++if (a[i] == a[i-1] + 1) cl++;
else cl = 1;
ml = max(ml, cl);
++

}

return ml;

};

sort(hBars.begin(), hBars.end());

sort(vBars.begin(), vBars.end());

int hm = f(hBars);

int vm = f(vBars);

int e = min(hm, vm);

return (e + 1) * (e + 1);

}

};

优化

class Solution {

// 128. 最长连续序列

int longestConsecutive(vector<int>& nums) {

unordered_set<int> st(nums.begin(), nums.end());

int ans = 0;

for (int x : st) { // 遍历哈希集合

++if (st.contains(x - 1))++

++continue;++

// x 是序列的起点

int y = x + 1;

while (st.contains(y))

y++;

// y-1 是最后一个在哈希集合中的数

ans = max(ans, y - x); // 从 x 到 y-1 一共 y-x 个数

}

return ans;

}

public:

int maximizeSquareHoleArea(int, int, vector<int>& hBars, vector<int>& vBars) {

++int side = min(longestConsecutive(hBars), longestConsecutive(vBars)) + 1;++

return side * side;

}

};

discussion发现的圣经

反复诵读TvT

"每个变量、每个逻辑分支对内完成的是什么功能、对外在整体程序中扮演的角色是什么"

"对待游戏一样享受这个过程"

lc2385

dfs不建图

利用负数,一次遍历

class Solution {

int ans = 0, start;

int dfs(TreeNode* node) {

if (node == nullptr) {

return 0;

}

int l_len = dfs(node->left);

int r_len = dfs(node->right);

if (node->val == start) {

// 计算子树 start 的最大深度

ans = -min(l_len, r_len); // 负负得正

return 1; // 用正数表示找到了 start

}

if (l_len > 0 || r_len > 0) {

// 只有在左子树或右子树包含 start 时,才能更新答案

ans = max(ans, abs(l_len) + abs(r_len)); // 两条链拼成直径

return max(l_len, r_len) + 1; // max 会自动取到正数

}

return min(l_len, r_len) - 1; // 用负数表示没有找到 start

}

public:

int amountOfTime(TreeNode* root, int start) {

this->start = start;

dfs(root);

return ans;

}

};

bfs建图

一次bfs建表

一次bfs找最远层数

class Solution {

public:

int amountOfTime(TreeNode* root, int start) {

unordered_map<TreeNode*, TreeNode*> p;

TreeNode* s = nullptr;

queue<TreeNode*> q;

q.push(root);

p[root] = nullptr;

while (!q.empty()) {

auto t = q.front();

q.pop();

if (t->val == start) s = t;

if (t->left) {

p[t->left] = t;

q.push(t->left);

}

if (t->right) {

p[t->right] = t;

q.push(t->right);

}

}

unordered_map<TreeNode*, bool> v;

q.push(s);

v[s] = true;

int res = -1;

while (!q.empty()) {

int sz = q.size();

res++;

while (sz--) {

auto t = q.front();

q.pop();

if (t->left && !v[t->left]) {

v[t->left] = true;

q.push(t->left);

}

if (t->right && !v[t->right]) {

v[t->right] = true;

q.push(t->right);

}

if (p[t] && !v[p[t]]) {

v[p[t]] = true;

q.push(p[t]);

}

}

}

return res;

}

};

dfs建图+bfs

class Solution {

public:

int amountOfTime(TreeNode* root, int start) {

unordered_map<int, vector<int>> g;

function<void(TreeNode*)> dfs = [&] (TreeNode *root) {

if (root == nullptr || root->left == root->right)

return;

if (root->left) {

int u = root->val, v = root->left->val;

g[u].emplace_back(v);

g[v].emplace_back(u);

}

if (root->right) {

int u = root->val, v = root->right->val;

g[u].emplace_back(v);

g[v].emplace_back(u);

}

dfs(root->left);

dfs(root->right);

};

dfs(root);

int time = -1;

queue<int> q;

q.push(start);

unordered_set<int> visited{start};

while (!q.empty()) {

time++;

int len = q.size();

while (len--) {

int cur = q.front();

q.pop();

for (int nei : g[cur]) {

if (visited.find(nei) != visited.end()) {

continue;

}

q.push(nei);

visited.insert(nei);

}

}

}

return time;

}

};

相关推荐
君为先-bey8 小时前
LeMiCa——基于扩散模型的高效视频生成的词典序最小化路径缓存
python·算法·机器学习·扩散模型
洛水水9 小时前
【力扣100题】58.轮转数组
算法·leetcode
资深流水灯工程师9 小时前
LMS 最小均方算法在 DSP 上的 C 语言实现
算法
风筝在晴天搁浅9 小时前
阿里 LeetCode 876.链表的中间节点
算法·leetcode·链表
玖釉-9 小时前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表
05候补工程师9 小时前
【408考研·数据结构专题】二叉树、树与森林、线索树及哈夫曼树核心考点与秒杀技巧深度总结
数据结构·经验分享·笔记·考研·算法
吃好睡好便好9 小时前
矩阵的加减运算
开发语言·人工智能·学习·线性代数·算法·matlab·矩阵
吃好睡好便好9 小时前
提取矩阵特定多行元素
开发语言·线性代数·算法·matlab·矩阵
葫三生9 小时前
多模态视角下的一部当代东方创世史诗 ——《论三生原理》?(扩版)
人工智能·科技·算法·机器学习·开源
stsdddd10 小时前
【YOLO算法包裹背包行李箱塑料袋包装纸盒快递盒带目标检测数据集】
算法·yolo·目标检测