并查集|栈

lc1668

不能直接跳

class Solution {

public:

int maxRepeating(string sequence, string word) {

int k = 0, n = sequence.size(), wn = word.size(), t = 0;

for (int i = 0; i <= n - wn; i++) {

if (sequence.substr(i, wn) == word) {

t = 1;

++int j = i + wn;++

++while (j++ + wn <= n && sequence.substr(j, wn) == word) {

++t++;++

j += wn;

}

k = max(k, t);

}

}

return k;

}

};

lc969

两次翻转实现煎饼排序:先找到当前未排序部分的最大元素

第一次翻转将其移到数组开头

第二次翻转将其移到当前未排序部分的末尾(即正确位置)

重复此过程直到数组有序,最终返回所有翻转操作的长度记录。

class Solution {

public:

vector<int> pancakeSort(vector<int>& a)

{

int n=a.size();

vector<int> res;

for(int i=n;i>1;--i){

int m=-1,idx=-1;

++for(int j=0;j<i;++j)++

++{
if(aj>m)m=aj,idx=j;
}
++

reverse(a.begin(),a.begin()+idx+1);

reverse(a.begin(),a.begin()+i);

res.push_back(idx+1);

res.push_back(i);

}

return res;

}

};

lc856

用栈处理括号字符串,左括号存0,遇右括号时,若栈顶是0(对应"()")则替换为1

若栈顶是数字(对应"(ABC)")则累加内部数字再乘2

最后把栈里所有分数相加ABC,得到括号的最终分数

class Solution {

public:

int scoreOfParentheses(string S)

{

stack<int> s;

for(char c:S){

if(c=='('){ //遇到左括号入栈,用0模拟

s.push(0);

}

else{ //遇到右括号进行判断

if(s.top()==0){ //栈顶为0即栈顶为左括号,此时为()的情况,得1分

s.pop();

s.push(1);

}

++else{ //栈顶不为左括号即为(ABC)的情况,得分为(A+B+C)*2
int inScore=0;
while(s.top()!=0){++

inScore+=s.top();

s.pop();

}

s.pop();

s.push(inScore*2);

}

}

}

int score=0;

while(!s.empty()){ //最后栈内都是分数,没有括号了,求和即可

score+=s.top();

s.pop();

}

return score;

}

};

lc1319.

dfs

class Solution {

public:

vector<vector<int>> build_graph(const int& n,const vector<vector<int>>& connections) const{

vector<vector<int>> graph(n,vector<int>());

for(auto& edge: connections){

graphedge\[0].push_back(edge1);

graphedge\[1].push_back(edge0);

}

return graph;

}

void dfs(const vector<vector<int>>& graph,unordered_set<int>& visited,int node){

if(visited.count(node))

return;

visited.insert(node);

for(const auto& neighbor: graphnode)

dfs(graph,visited,neighbor);

}

int makeConnected(int n, vector<vector<int>>& connections) {

if(connections.size() < n-1)

return -1;

// 建图

vector<vector<int>> graph = build_graph(n,connections);

unordered_set<int> visited;

int connected_components = 0;

// 遍历顶点

for(int node = 0;node < n;node++){

// 如果没被访问过

if(!visited.count(node)){

connected_components++;

dfs(graph,visited,node);

}

}

return connected_components-1;

}

};

并查集写法

class UnionFind

{

private:

unordered_map<int,int> father;

int num_of_sets;

public:

UnionFind(int size): num_of_sets(size){

for(int i = 0;i < size;i++)

fatheri = i;

}

++int get_num_of_sets(){++

return num_of_sets;

}

++int find(int x){++

if(fatherx == x) return x;

// 路径压缩

fatherx = find(fatherx);

return fatherx;

}

++bool is_connected(int x,int y){++

return find(x) == find(y);

}

++void merge(int x,int y){++

fatherfind(x) = find(y);

num_of_sets--;

}

};

class Solution {

public:

int makeConnected(int n, vector<vector<int>>& connections) {

if(connections.size() < n-1) return -1;

UnionFind uf(n);

for(auto& edge: connections){

if(!uf.is_connected(edge0,edge1)){

uf.merge(edge0,edge1);

}

}

return uf.get_num_of_sets() - 1;

}

};

相关推荐
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小小龙学IT5 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
知无不研6 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
C++ 老炮儿的技术栈8 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qz_Serene10 小时前
C++:类和对象(上)
开发语言·c++
郝学胜-神的一滴11 小时前
干货版《算法导论》17:二叉树核心原理、遍历逻辑与高阶实操全解
数据结构·c++·python·算法·计算机·编程
hetao173383712 小时前
2026-08-09~08-14 hetao1733837 的刷题记录
c++·算法
间歇性努力持续性发呆的野生快乐选手14 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
旖旎夜光15 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
hansang_IR15 小时前
【题解】P14468 [COCI 2025/2026 #1] 和谐 / Harmonija(线段树 DDP 版本)
c++·算法·动态dp