【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])
posted @ 2024-07-24 00:32  TICSMC  阅读(9)  评论(0)    收藏  举报