马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
记载了开端解题思绪 以及本地实当代码;并不肯定为最优 也渴望各人能一起探究 一起进步
7/15 721. 账户归并
根据标题意思 只要两个账号中包罗雷同的邮箱地点 则以为两个账号可以归并
使用并查集
对每个邮箱创建一个尽头邮箱
mailPos: {email:账号位置} 记载全部邮箱对应的账号位置 出现多次对应哪个位置都可以 由于认定为一个账号
rootSet: 存储每个邮箱的尽头邮箱 若尽头邮箱雷同 则代表两个邮箱在同一个账号中
find:
探求邮箱i的尽头邮箱 并返回
union:
探求邮箱i,j的尽头邮箱
若差别
则将i的尽头变为j的尽头 及将i,j变为同一个账号
遍历已有的账号
将一个账号内的邮箱归并 这里和第一个邮箱归并
结果天生:
遍历全部存在的邮箱
找到其尽头邮箱 dic内key为尽头邮箱的账号位置 将这个邮箱参加此中
末了参加账号位置上的账号名称
- def accountsMerge(accounts):
- """
- :type accounts: List[List[str]]
- :rtype: List[List[str]]
- """
- from collections import defaultdict
-
-
- mailPos = {mail:pos for pos,account in enumerate(accounts) for mail in account[1:]}
- rootSet = {mail:mail for mail in mailPos}
-
- def find(i):
- while rootSet[i]!=i:
- rootSet[i] = rootSet[rootSet[i]]
- i = rootSet[i]
- return i
-
-
- def union(i,j):
- if i!=j:
- endi = find(i)
- endj = find(j)
- if endi!=endj:
- rootSet[endi] = rootSet[j]
-
- for account in accounts:
- l = len(account)
- for i in range(1,l):
- email = account[i]
- union(email,find(account[1]))
-
-
- dic = defaultdict(set)
- for mail in rootSet:
- pos = mailPos[find(mail)]
- dic[pos].add(mail)
-
- ans = [[accounts[pos][0]]+sorted(mail) for pos,mail in dic.items()]
- return ans
复制代码 7/16 2956. 找到两个数组中的公共元素
遍历两个数组统计
判定元素 是否存在另一个数组中
- def findIntersectionValues(nums1, nums2):
- """
- :type nums1: List[int]
- :type nums2: List[int]
- :rtype: List[int]
- """
- s1,s2 = set(nums1),set(nums2)
- c1,c2 = 0,0
- for v in nums1:
- if v in s2:
- c1+=1
- for v in nums2:
- if v in s1:
- c2+=1
- return [c1,c2]
复制代码 7/17 2959. 关闭分部的可行聚集数量
用n位二进制来代表当前情况保存节点的状态
罗列保存节点的状态 判定该状态下是否满意要求
- def numberOfSets(n, maxDistance, roads):
- """
- :type n: int
- :type maxDistance: int
- :type roads: List[List[int]]
- :rtype: int
- """
- g = [[float("inf")]*n for _ in range(n)]
- for i in range(n):
- g[i][i]=0
- for x,y,v in roads:
- g[x][y]= min(g[x][y],v)
- g[y][x]= min(g[y][x],v)
-
- f = [None]*n
- def func(s):
- for i,r in enumerate(g):
- if s>>i &1:
- f[i] = r.copy()
- for k in range(n):
- if (s>>k & 1) == 0:
- continue
- for i in range(n):
- if (s>>i & 1) ==0 or f[i][k]==float("inf"):
- continue
- for j in range(n):
- f[i][j] = min(f[i][j],f[i][k]+f[k][j])
- for i,d in enumerate(f):
- if (s>>i & 1)==0:
- continue
- for j,dd in enumerate(d):
- if s>>j & 1 and dd>maxDistance:
- return 0
- return 1
- return sum(func(s) for s in range(1<<n))
复制代码 7/18 3112. 访问消散节点的最少时间
dijkstra
从0开始访问可以或许访问到的节点
小顶堆h存储(d,x)
d为访问到x节点必要的时间隔断
每次取堆内迩来可以或许访问到的节点
遍历该节点毗连的其他节点 y
假如能在节点y消散前大概比已知更快到达 则更新节点y的结果
- def minimumTime(n, edges, disappear):
- """
- :type n: int
- :type edges: List[List[int]]
- :type disappear: List[int]
- :rtype: List[int]
- """
- import heapq
- g = [[] for _ in range(n)]
- for x,y,v in edges:
- g[x].append((y,v))
- g[y].append((x,v))
-
- ans = [-1]*n
- ans[0]=0
- h = [(0,0)]
- while h:
- d,x = heapq.heappop(h)
- if d>ans[x]:
- continue
- for y,v in g[x]:
- newd = d+v
- if newd < disappear[y] and (ans[y]<0 or ans[y]>newd):
- ans[y]=newd
- heapq.heappush(h, (newd,y))
- return ans
复制代码 7/19 3096. 得到更多分数的最少关卡数量
先求得完玉成部关卡的分数total
重新开始记载每一关后得到的分数cur 同时减去cur为剩余的分数
判定当前分数是否大于剩余分数
- def minimumLevels(possible):
- """
- :type possible: List[int]
- :rtype: int
- """
- total = 0
- for v in possible:
- if v==1:
- total +=1
- else:
- total -=1
- cur = 0
- num = 0
- tag = False
- for v in possible[:-1]:
- num+=1
- if v==1:
- cur +=1
- total -=1
- else:
- cur -=1
- total +=1
- if total<cur:
- tag = True
- break
- return num if tag else -1
复制代码 7/20 2850. 将石头分散到网格图的最少移动次数
使用f记载石头可以移除的位置
使用t记载石头必要进入的位置
全分列f 依次盘算每种情况必要的步数
- def minimumMoves(grid):
- """
- :type grid: List[List[int]]
- :rtype: int
- """
- import itertools
- f,t = [],[]
- for i,row in enumerate(grid):
- for j,cnt in enumerate(row):
- if cnt>1:
- f.extend([(i, j)] * (cnt - 1))
- elif cnt==0:
- t.append((i,j))
- ans=float("inf")
- for ff in itertools.permutations(f):
- total = 0
- for (x1,y1),(x2,y2) in zip(ff,t):
- total += abs(x1-x2)+abs(y1-y2)
- ans = min(ans,total)
- return ans
-
复制代码 7/21 1186. 删除一次得到子数组最大和
动态规划
dp0表现arr末了删除0次的最大和
dp1表现arr末了删除1次的最大和
dp0 = max(dp0[i-1],0)+arr
dp1 = max(dp1[i-1]+arr,dp0[i-1])
- def maximumSum(arr):
- """
- :type arr: List[int]
- :rtype: int
- """
- dp0,dp1=arr[0],0
- ans = dp0
- for i in range(1,len(arr)):
- dp1 = max(dp1+arr[i],dp0)
- dp0 = max(dp0,0)+arr[i]
- ans = max(ans,max(dp1,dp0))
- return ans
复制代码
|