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;

}

};

相关推荐
罗湖老棍子2 小时前
团伙(group)(信息学奥赛一本通- P1385)
算法·图论·并查集
Ka1Yan3 小时前
[链表] - 代码随想录 160. 相交链表
算法·leetcode·链表
学嵌入式的小杨同学3 小时前
C 语言实战:动态规划求解最长公共子串(连续),附完整实现与优化
数据结构·c++·算法·unity·游戏引擎·代理模式
rgeshfgreh3 小时前
顺序表实战:构建到销毁全解析
算法
十八岁讨厌编程3 小时前
【算法训练营Day32】图论专题
算法·深度优先·图论
小欣加油3 小时前
leetcode 174 地下城游戏
c++·算法·leetcode·职场和发展·动态规划
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章11-高斯滤波
图像处理·人工智能·opencv·算法·计算机视觉
不知名XL4 小时前
day23 贪心算法 part01
算法·贪心算法
wuqingshun3141594 小时前
蓝桥杯 缺页异常2【算法赛】
算法·职场和发展·蓝桥杯