1. 每日一题–959 由斜杠划分区域
连通或连通块的问题可以使用BFS或者DFS或者并查集解决。
class Solution(object):
def regionsBySlashes(self, grid):
"""
:type grid: List[str]
:rtype: int
"""
#并查集
n=len(grid)
self.count=4*n*n
parent=[]
for i in range(self.count):
parent.append(i)
for i in range(n):
for j in range(n):
index=4*(i*n+j)
# 小方格内合并
if(grid[i][j]==' '):
self.union(parent,index,index+1)
self.union(parent,index,index+2)
self.union(parent,index,index+3)
elif(grid[i][j]=='/'):
self.union(parent,index,index+3)
self.union(parent,index+1,index+2)
elif(grid[i][j]=='\\'):
self.union(parent,index,index+1)
self.union(parent,index+2,index+3)
# 小方格间合并
if(j+1<n): # 左右合并
self.union(parent,index+1,4*(i*n+j+1)+3)
if(i+1<n): # 上下合并
self.union(parent,index+2,4*((i+1)*n+j))
return self.count
def findparent(self,parent,x):
while(x!=parent[x]):
parent[x]=parent[parent[x]]
x=parent[x]
return x
def union(self,parent,idx1,idx2):
p1=self.findparent(parent,idx1)
p2=self.findparent(parent,idx2)
if(p1==p2):
return
parent[p2]=p1
self.count-=1
find和union是并查集中的关键
以前没有注意python中self的用法
2.一维数组的动态和
3.最富有客户的资产总量
4.好数对的数目
如果有n个相同的数,那么可以组成n*(n-1)/2对好数对
用字典存储键值对
class Solution(object):
def numIdenticalPairs(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 如果有n个一样的数,那么它们能组成n*(n-1)对好数对
# 统计每个数字出现的次数
dict={}
for i in range(len(nums)):
if(dict.has_key(nums[i])==False):
dict[nums[i]]=1
else:
dict[nums[i]]+=1
paircount=0
for key,value in dict.items():
paircount+=value*(value-1)/2
return paircount