【Leetcode】2766-1613
前言
今天是睡得晚,这会儿一看时间已经过了十二点了,再一看今天的 题目不是很难就直接做了,可能是最近不知道多久最早一天中的提交时间了把
思路
既然每次都有了从哪里移动到哪里,那么我们直接模拟整个操作即可
class Solution:
def relocateMarbles(self, nums: List[int], moveFrom: List[int], moveTo: List[int]) -> List[int]:
t = defaultdict(int,Counter(nums))
for i,x in enumerate(moveFrom):
y = moveTo[i]
t[x],t[y] = 0,t[x]+t[y]
return sorted([x for x in list(t.keys()) if t[x]!=0])
但是转念一想,似乎其实每个位置有多少个石子是不在意的,要求的结果也只是返回有石子的位置而不需要个数,因此字典的方式直接改为集合set类型
class Solution:
def relocateMarbles(self, nums: List[int], moveFrom: List[int], moveTo: List[int]) -> List[int]:
t = set(nums)
for i,x in enumerate(moveFrom):
y = moveTo[i]
t.remove(x)
t.add(y)
return sorted(list(t))
此外,我们换一种思路,对于moveto而言,其中的位置都是可能有石子的位置,取决于后续movefrom是否已经去除掉了。而movefrom而言,都是有可能不存在石子的位置,取决于后续是否moveto里边有没有这个位置。
因此考虑movefrom和moveto对应位置分别为位置x和位置y。如果后续moveto存在x,说明最后的位置x是一定有的;如果后续movefrom存在y,则最后位置y一定是没有的。
因此可以倒序遍历,将一定在最后出现的和一定不出现的进行存储,
需要注意的是,由于初始某些位置存在一些石子,但是这些位置可能经过move之后,根本没有操作,因此需要加上初始的位置
class Solution:
def relocateMarbles(self, nums: List[int], moveFrom: List[int], moveTo: List[int]) -> List[int]:
n = len(moveFrom)
no = set()
ans = []
for i in range(n-1,-1,-1):
x,y = moveFrom[i], moveTo[i]
if y not in no:
ans.append(y)
no.add(y)
no.add(x)
return sorted(ans+[x for x in set(nums) if x not in no])

浙公网安备 33010602011771号