力扣305,岛屿数量,并查集。

  1. 岛屿数量 II
    https://leetcode-cn.com/problems/number-of-islands-ii/
    力扣305,岛屿数量,并查集。_第1张图片
    主要的想法是用并查集,改一下并查集的代码就好了。假设每个相邻的两个格子之间有条边。整体的代码感觉还能再优化些。
####首先将建个m*n长的数组parent,表示每个格子,m*n长的数组rankx用于路径压缩。
####寻根的函数若parent[i] = i那么就代表这个i位置就是一个根节点。find_root函数寻找一个节点的根节点。
ans ,res= [],0 ####ans最终的结果数组,res每一步的结果。
parent = [-1]*(m*n)
rankx = [0]*(m*n)
def find_root(x,parent):
	  while parent[x]!= x:
	      x = parent[x]
	  return x
####union_xy用于合并两个节点,这里每一次加一个positions[k] = [i,j]则这个点在parent的下标就为
##idx = i*n+j ,然后合并将[i,j]这个点和其上下左右合并。
def union_xy(x,y,parent,rankx):
    x = find_root(x,parent)
    y = find_root(y,parent)
    if x ==y:
        return 0
    else:
        if rankx[x] > rankx[y]:
            parent[y] = x 
        elif rankx[y] > rankx[x]:
            parent[x] = y
        else:
            parent[x] = y
            rankx[y] += 1
        return 1
for d in positions:
            flag = False ####用于判断该节点是否已经是陆地
            i,j = d[0],d[1]
            idx = i*n+j
            tmp = []
            if parent[idx] == -1:                
                parent[idx] = idx
                tmp.append(parent[idx])
            else:
                flag = True  ####如果是就直接输出上一轮得陆地块数一样多
                tmp.append(parent[idx])
            for k in range(4): 
                x,y= dx[k]+i,dy[k]+j
                if x>=0 and x<m and y >= 0 and y<n:####如果[i,j]的上下左右没有越界。
                    idy = x*n+y  ####其在parent数组的下标
                    if  parent[idy]!=-1 :
                        pv = find_root(idy,parent)          
                        tmp.append(pv)
                    else:
                        tmp.append(-1)   ####if-else 用于记录合并之前,[i,j]周围节点的状态,-1或者其根节点。
                    if parent[idy] != -1:
                        union_xy(idx,idy,parent,rankx)    ####合并[i,j]和满足条件的四周节点         
            tmp2 = [find_root(idx,parent)]
            for k in range(4):  ####用于记录合并后的[i,j]及周围节点的状态,
                x,y= dx[k]+i,dy[k]+j
                if x>=0 and x<m and y >= 0 and y<n:
                    idy = x*n+y
                    if parent[idy]!=-1:
                        pv = find_root(idy,parent)
                        tmp2.append(pv)
                    else:
                        tmp2.append(-1)
            t1,t2 = [],[]
            for i in range(len(tmp)):
                if tmp[i] !=-1 and tmp[i] not in t1:
                    t1.append(tmp[i])
                if tmp2[i] !=-1 and tmp2[i] not in t2:
                    t2.append(tmp2[i])
            print(t1,t2,tmp,tmp2)
            if flag: 
                res += len(t2)-len(set(t1))
            else:
                res += len(t2)-len(set(t1))+1
                
            ans.append(res) 

你可能感兴趣的:(数据结构与算法)