并查集:

并查集的初始化:

自己的root先初始化为自己。

如果需要合并ab, 则把b的老大指向a

并查集优化1:

需要多创建一个数据结构rank去查看深度

将短链的root接在长链上,降低查找深度

xRoot.rank yRoot.rank   rank是一个变量,用来表示查找深度

优化2:

200. 岛屿问题:

自己的解法1:DFS

注意问题:

如果发现回溯超过最大限制,一定是位置置0存在问题。

1.调用函数: 函数名(变量)  一定是小括号

2.岛屿问题这里是引号“ ” 的字符,不是0和1

class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.row = len(grid)self.col = len(grid[0])self.count = 0self.grid =gridfor i in range(self.row):for j in range(self.col):if self.grid[i][j] == "1":self.grid[i][j] = "0"   self.count += 1 self.put_zero(i,j)return self.countdef put_zero(self,i,j):if i+1<self.row:if self.grid[i+1][j] == "1":self.grid[i+1][j] = "0"  self.put_zero(i+1,j)  if j+1<self.col: if self.grid[i][j+1] == "1":self.grid[i][j+1] = "0"  self.put_zero(i,j+1)   if i-1>=0:if self.grid[i-1][j] == "1":self.grid[i-1][j] = "0"  self.put_zero(i-1,j)if j-1>=0:if self.grid[i][j-1] == "1":self.grid[i][j-1] = "0"  self.put_zero(i,j-1)   return 

解法2:

class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.row = len(grid)self.col = len(grid[0])self.count = 0self.grid =gridfor i in range(self.row):for j in range(self.col):if self.grid[i][j] == "1":self.put_zero(i,j)self.count += 1return self.countdef put_zero(self,i,j):if not 0<=i<self.row or not 0<=j<self.col  or self.grid[i][j] == '0':returnself.grid[i][j] = '0'self.put_zero(i+1,j)self.put_zero(i-1,j)self.put_zero(i,j+1)self.put_zero(i,j-1)return 

如何遍历上下左右:

self.dx = [-1,1,0,0]
self.dy = [0,0,-1,1]
for k in range(4):self.dfs(x+self.dx[k],y+self.dy[k])

放入这道题中:

class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.row = len(grid)self.col = len(grid[0])self.count = 0self.grid =gridself.dx = [-1,1,0,0]self.dy = [0,0,-1,1]for i in range(self.row):for j in range(self.col):if self.grid[i][j] == "1":  self.count += 1 self.put_zero(i,j)return self.countdef put_zero(self,i,j):if (not 0 <= i <self.row) or (not 0<=j<self.col ) or self.grid[i][j] == "0": returnelse:self.grid[i][j] = "0"for k in range(4):self.put_zero(i+self.dx[k],j+self.dy[k])return 

这道题的并查集class代码:

class UnionFind(object): #并查集def __init__(self,grid):m,n = len(grid), len(grid[0])self.count = 0self.parent = [-1] *(m*n) #rootself.rank = [0]*(m*n) #深度for i in range(m):for j in range(n):if grid[i][j] == '1':self.parent[i*n+j] = i*n +jself.count += 1def find(self,i):if self.parent[i] != i:self.parent[i] = self.find(self.parent[i])return self.parent[i]def union(self,x,y):rootx = self.find(x)rooty = self.find(y)if rootx != rooty:if self.rank[rootx] >self.rank[rooty]:self.parent[rooty] = rootxelif self.rank[rooty] >self.rank[rootx]:self.parent[rootx] = rootyelse:self.parent[rooty] = rootxself.rank[rootx] += 1self.count -= 1

用并查集的思想去处理这道题目:

这里我们把二维grid的parent给平面化,用一维数组去表示它的parent

并查集思路:

init: 里面,将每一个元素的parent指向自身。 遍历每一个元素的时候增加集合数量。此时集合的总数量为元素总数量

find: 用递归去找这个元素的头

union:用第一种优化方式,引入rank,从而在合并的时候将短链接在长链的root上面。如果两条链相等,接在哪一条都行。若是y接在x的头上,则x的rank要+1。每次union合并的时候,集合总数减1.

遍历还有一个办法:用

 directions = [(0,1),(0,-1),(1,0),(-1,0)]for d in directions:row = i+d[0]col = j+d[1]

这样去判断上下左右的方向也是可以的

回到这道题目本身:

将grid初始化为uf的对象。

循环每个为1的节点,若它上下左右的节点不为1,则将他们合并

最后数有多少个集合,则为多少个岛屿

class UnionFind(object): #并查集def __init__(self,grid):m,n = len(grid), len(grid[0])self.count = 0self.parent = [-1] *(m*n) #rootself.rank = [0]*(m*n) #深度for i in range(m):for j in range(n):if grid[i][j] == '1':self.parent[i*n+j] = i*n +jself.count += 1def find(self,i):if self.parent[i] != i:self.parent[i] = self.find(self.parent[i])return self.parent[i]def union(self,x,y):rootx = self.find(x)rooty = self.find(y)if rootx != rooty:if self.rank[rootx] >self.rank[rooty]:self.parent[rooty] = rootxelif self.rank[rooty] >self.rank[rootx]:self.parent[rootx] = rootyelse:self.parent[rooty] = rootxself.rank[rootx] += 1self.count -= 1
class Solution:def numIslands(self, grid: List[List[str]]) -> int:if not grid or not grid[0]:return 0uf = UnionFind(grid)directions = [(0,1),(0,-1),(1,0),(-1,0)]m,n  = len(grid),len(grid[0])for i in range(m):for j in range(n):if grid[i][j] == '0':continuefor d in directions:row = i+d[0]col = j+d[1]if 0<=row<m and 0<=col<n and grid[row][col] != '0':uf.union(i*n+j,row*n+col)return uf.count

547.朋友圈问题。不用DFS,用并查集解决:

class Unionfind(object):def __init__(self,isConnected):self.r = len(isConnected)self.count = 0self.root = [-1]*(self.r)self.rank = [0]*(self.r)for i in range(self.r):self.root[i] = iself.count += 1def find(self,x):while self.root[x] != x:x = self.root[x] return self.root[x]def union(self,x,y):if x == y:returnrootx = self.find(x)rooty = self.find(y)if rootx == rooty:returnif self.rank[rootx] > self.rank[rooty]:self.root[rooty] = rootxelif self.rank[rootx] < self.rank[rooty]:self.root[rootx] = rootyelse:self.root[rooty] = rootxself.rank[rootx] += 1self.count -= 1class Solution:def findCircleNum(self, isConnected: List[List[int]]) -> int:row = len(isConnected)uf = Unionfind(isConnected)for i in range(row):for j in range(i,row):if isConnected[i][j] == 1 :uf.union(i,j)return uf.count

2021-07-01:并查集,200岛屿问题,547朋友圈问题相关推荐

  1. 并查集——小米笔试题求朋友圈个数,分小组个数

    先给出小米的题: 已知有n个人和m对好友关系(存于数组r).如果两个人是直接或间接的好友(好友的好友的好友-),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. 假如:n = 5 ...

  2. 力扣 547. 朋友圈 c语言 三种解法 深搜 广搜 并查集。

    题目: 并查集: /*力扣 547 朋友圈 并查集 c语言 2020/12/14 1:04 by ksks14*/ /*初始化 查找 合并*/ #define maxsize 10000 int fl ...

  3. Neovim开发环境搭建(2021.07.01)

    Neovim开发环境搭建(2021.07.01) 一.搭建环境 Ubuntu 21.04 Neovim 0.4.4 二.Neovim安装 # 下载 neovim,如遇网络问题可以采用 https:// ...

  4. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  5. 并查集专题练习:好朋友(未完待续)

    有空再把题目补上 输入样例1 4 2 1 4 2 3 样例输出1 2 输入样例2 7 5 1 2 2 3 3 1 1 4 5 6 输出样例2 3 解题思路: 1. 这题放在并查集的专题后面,有查找也有 ...

  6. 并查集应用:敌人和朋友

    package Algorithms_算法.作业.Friend_Enemy_并查集;public class UnionSet {private int []unions,enemy,rank;int ...

  7. 项目实训2021.07.01

    学习Flask框架. 参考:https://blog.csdn.net/weixin_43778491/article/details/86661285

  8. 样式集(五)微信朋友圈样式模拟

    效果图: 小图标: 源码: <!--pages/findList/findList.wxml--> <image class="xxiangji" catchta ...

  9. Leetcode一起攻克搜索(BFS,DFS,回溯,并查集)

    文章目录 BFS简介 DFS简介 回溯简介 并查集简介 DFS题目 690. 员工的重要性 1.dfs解法: 2.bfs算法 547.朋友圈 dfs解法 200.岛屿数量 dfs解法 417.太平洋大 ...

最新文章

  1. HDU4858 项目管理 其他
  2. TensorFlow 2——替换【tensorflow.compat.v1.contrib.rnn.LSTMCell】解决方案
  3. Creating UIImage with renderingMode in Swift
  4. kubelet配置cni插件_Kubernetes CNI网络插件
  5. 京东:618 期间遭「黑公关」恶意抹黑;Adobe 回应“杀死Flash”;Bootstrap 5.0 Alpha 发布 |...
  6. Bailian2886 能被3除尽的数之和【进制】
  7. 【MySQL学习】Unknown column 'PASSWORD'|Access denied for user 'root'@'localhost'
  8. 使用windbg通过vtable找到优化后的this指针
  9. java 双向链表_数据结构-链表、栈和队列
  10. ARKit入门到精通-1.5 -基础内容-史小川-专题视频课程
  11. 机器人动力学与控制学习笔记(七)————基于计算力矩法的滑模控制
  12. “U盘写保护”什么解除
  13. 思维题:三个箱子,一个只装苹果,一个只装橙,另一个装苹果和橙,请问?
  14. 短信宝接入发送短信实测 Java
  15. 日本留学签证丢失如何补办
  16. 【知识兔】自学Excel之10:格式化工作表
  17. 【雨滴降落的速度是每秒10米】
  18. 热烈庆祝偶的同学小说《寒窗泪》发表
  19. 为何优秀的程序员不断离开?,中高级Java面试中你不得不会的知识点
  20. GBK、UTF-8、UTF-32、乱码原因

热门文章

  1. Qt生成中文名称的exe
  2. keras学习文档入门
  3. 前端HTML+CSS面试题汇总一
  4. 生物信息学|用于预测药物-药物相互作用事件的多模态深度学习框架
  5. 数据库web管理工具treesoft的安装与使用
  6. 集线器、网桥、交换机
  7. mac电脑打不开html文件怎么处理,苹果电脑Mac打不开网页怎么办?Mac打不开网页的解决方法...
  8. jQuery实现的各种不同样式弹出框
  9. 欧路词典 for mac(词典软件)破解版
  10. log4j日志文件模板配置整理