第 324 场周赛
比赛链接
Date: 2022-12-18
A 统计相似字符串对的数目
复杂度分析
- 时间复杂度:\(O(nm)\)
- 空间复杂度:\(O(n)\)
B 使用质因数之和替换后可以取到的最小值
质因数分解
复杂度分析
- 时间复杂度:\(O(\sqrt n)\)
- 空间复杂度:\(O(1)\)
C 添加边使所有节点度数都为偶数
对于度数为 2 的特殊处理即可。
| class Solution {
public:
bool isPossible(int n, vector<vector<int>>& edges) {
vector<vector<int>> g(n + 1);
for (auto &v : edges) {
g[v[0]].push_back(v[1]);
g[v[1]].push_back(v[0]);
}
for (int i = 1; i <= n; i++) {
sort(g[i].begin(), g[i].end());
}
int odd = 0;
vector<int> cand;
for (int i = 1; i <= n; i++) {
if (g[i].size() & 1) {
odd++;
cand.push_back(i);;
}
}
if (odd != 0 && odd != 2 && odd != 4) {
return false;
}
if (odd == 0) return true;
auto get = [&](int x, int y) {
int pos = lower_bound(g[x].begin(), g[x].end(), y) - g[x].begin();
if (pos < g[x].size() && g[x][pos] == y) {
return false;
}
return true;
};
if (odd == 2) {
if (get(cand[0], cand[1])) {
return true;
}
for (int i = 1; i <= n; i++) {
if (i != cand[0] && i != cand[1]) {
if (get(cand[0], i) && get(cand[1], i)) {
return true;
}
}
}
return false;
}
return (get(cand[0], cand[1]) && get(cand[2], cand[3])) || (get(cand[0], cand[2]) && get(cand[1], cand[3])) || (get(cand[0], cand[3]) && get(cand[1], cand[2]));
}
};
|
复杂度分析
- 时间复杂度:\(O(n\log n)\)
- 空间复杂度:\(O(m)\)
D 查询树中环的长度
两个点的编号,二进制表示中最长相同前缀即最近公共祖先,剩下的部分就是距离
复杂度分析
- 时间复杂度:\(O(n\log n)\)
- 空间复杂度:\(O(1)\)
本文访问 次