- class Solution {
- public:
- int direct[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
- int res=0;
- void dfs(vector
int >>&grid,vectorbool >>&visted,int x,int y){ - for(int i=0;i<4;i++){
- int nextx=x+direct[i][0];
- int nexty=y+direct[i][1];
- if(nextx>=0 && nextx
size() && nexty>=0 && nexty0].size()){ - if(!visted[nextx][nexty]){
- if(grid[nextx][nexty]==0) res++;//那一边是海面
- else{
- visted[nextx][nexty]=true;
- dfs(grid,visted,nextx,nexty);
- }
- }
- }
- else res++;//那一边是边界
- }
- }
- int islandPerimeter(vector
int >>& grid) { - int n=grid.size(),m=grid[0].size();
- vector
bool>>visted(n,vector<bool>(m,false)); - for(int i=0;i
- for(int j=0;j
- if(!visted[i][j] && grid[i][j]==1){
- visted[i][j]=true;
- dfs(grid,visted,i,j);
- }
- }
- }
- return res;
- }
- };
1971.寻找图中是否存在路径
分析:
- 寻找两个节点间是否存在路径,就是寻找两个节点是否在同一集合中
思路一:并查集
- 1.初始化集合
- 2.把各个节点进行连接
- 3.寻根判断
- class Solution {
- public:
- int n=200005;
- vector<int>father=vector<int>(n,0);
- void init(){//并查集初始化
- for(int i=0;i
- }
- int find(int u){//并查集寻根
- return u==father[u]?u:father[u]=find(father[u]);
- }
- bool isSame(int u,int v){
- u=find(u);
- v=find(v);
- return u==v;
- }
- void join(int u,int v){//连接两个节点
- u=find(u);
- v=find(v);
- if(u==v) return;//说明已经存在连接
- father[u]=v;//进行连接
- }
- bool validPath(int n, vector
int >>& edges, int source, int destination) { - init();
- for(int i=0;i
size();i++) join(edges[i][0],edges[i][1]);//连接节点 - return isSame(source,destination);//寻根判断
- }
- };
684.冗余连接
分析:
- 1.出现两个节点在同一集合,即有冗余
思路一:并查集
- 1.初始化
- 2.边添加边判断
- class Solution {
- public:
- vector<int>father=vector<int>(1001,0);
- void init(){
- for(int i=0;i<1001;i++) father[i]=i;
- }
- int find(int u){//寻根
- return u==father[u]?u:father[u]=find(father[u]);
- }
- bool isSame(int u,int v){//判断是否同一集合
- u=find(u);
- v=find(v);
- if(u==0 && v==0) return false;
- return u==v;
- }
- void join(int u,int v){//连接节点
- u=find(u);
- v=find(v);
- if(u==v) return;
- father[u]=v;
- }
- vector<int> findRedundantConnection(vector
int >>& edges) { - init();//初始化!!!
- int n=edges.size();
- for(int i=0;i
- if(isSame(edges[i][0],edges[i][1])) return edges[i];//出现两个节点在同一集合
- else join(edges[i][0],edges[i][1]);
- }
- return vector<int>();
- }
- };
685.冗余连接 ||
分析:
- 只存在一条冗余边,有三种情况:

- 1.入度可以通过遍历获取
- 2.环可以通过判断两节点是否在同一集合获取
思路一:并查集
- 1.先获取所有节点的入度
- 2.存在节点入度为2:
- 倒序找出入度为 2 的节点边
- 节点边不考虑时,判断图是否为树
- 3.不存在节点入度为2:
- 判断删除那一条边存在环,直接返回
- class Solution {
- public:
- static const int N=1010;
- int father[N];
- int n;
- void init(){//初始化
- for(int i=1;i<=n;++i) father[i]=i;
- }
- int find(int u){//寻根
- return u==father[u]?u:father[u]=find(father[u]);
- }
- bool same(int u,int v){//判断是否在同一集合
- u=find(u);
- v=find(v);
- return u==v;
- }
- void join(int u,int v){//连接两个节点
- u=find(u);
- v=find(v);
- if(u==v) return;
- father[u]=v;
- }
- vector<int> getMoveEdge(const vector
int >>&edges){//获取要删除的冗余边 - init();
- for(int i=0;i
- if(same(edges[i][0],edges[i][1])) return edges[i];//已经存在同一集合,所以此线冗余
- join(edges[i][0],edges[i][1]);
- }
- return {};//不存在冗余
- }
- bool judge(const vector
int >>&edges,int deleteEdge){//判断删除该边是否是树 - init();
- for(int i=0;i
- if(i==deleteEdge) continue;//删除就不考虑
- if(same(edges[i][0],edges[i][1])) return false;//仍然存在同一集合,绝对不是树
- join(edges[i][0],edges[i][1]);
- }
- return true;
- }
-
- vector<int> findRedundantDirectedConnection(vector
int >>& edges) { - n=edges.size();
- int inDegree[N]={0};
- vector<int>mid;
- for(int i=0;i
1]]++;//记录入度 - for(int i=n-1;i>=0;i--){//从右侧开始记录
- if(inDegree[edges[i][1]]==2) mid.push_back(i);//记录入度为2的节点的下标
- }
- if(mid.size()>0){//存在入度为2的节点
- if(judge(edges,mid[0])) return edges[mid[0]];//最右边的边不考虑,图为树
- else return edges[mid[1]];
- }
- return getMoveEdge(edges);
- }
- };
-
相关阅读:
分布式代理IP的优势及用途有哪些?
用动态规划算法均分纸牌
Android studio在Ubuntu桌面上 创建桌面图标,以及导航栏图标
物联网5种无线传输协议特点大汇总
springboot系列(十四):如何实现发送图片、doc文档等附件邮件?你一定得会|超级详细,建议收藏
js比较时间戳是否为同一天
红黑树实现
AI人工智能进阶-BERT/Transformer/LSTM/RNN原理与代码
科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?
Oracle 本地客户端连接远程 Oracle 服务端并使用 c# 连接测试
-
原文地址:https://blog.csdn.net/Ricardo_XIAOHAO/article/details/133576158