LeetCode 第 273 场周赛总结

5963. 反转两次的数字

这是我写的:执行用时: 32 ms,内存消耗: 14.9 MB

class Solution:
    def isSameAfterReversals(self, num: int) -> bool:
        if num == 0:
            return True
        return True if num % 10 != 0 else False

5964. 执行所有后缀指令

这题真的能看出来算法的博大精深,因为我的用时和大佬的差距太太太大了。
这是我写的:执行用时: 3056 ms,内存消耗: 15.1 MB

class Solution:
    def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
        m = len(s)
        ans = [0 for i in range(m)]
        moves = {
            "L":[0, -1],
            "R":[0, 1],
            "U":[-1, 0],
            "D":[1, 0]
        }
        for i in range(m):
            pos = startPos
            move = moves[s[i]]
            tmp = [pos[i] + move[i] for i in range(2)]
            if (0 <= tmp[0] < n) and (0 <= tmp[1] < n):
                for j in range(i+1, m):
                    move = moves[s[j]]
                    tmp = [tmp[i] + move[i] for i in range(2)]
                    if not (0 <= tmp[0] <= n-1 and 0 <= tmp[1] <= n-1):
                        ans[i] = j - i
                        break
                if ans[i] == 0:
                    ans[i] = m - i
            else:
                ans[i] = 0
        return ans

这是大佬写的:执行用时: 1016 ms,内存消耗: 15.1 MB,双100%

class Solution:
    def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
        ans,d = [],{'R':(0,1),'L':(0,-1),'U':(-1,0),'D':(1,0)}
        for i in range(len(s)):
            ops,tmp = s[i:],0
            x,y = startPos[0],startPos[1] # 初始坐标
            for op in ops:
                x,y = x+d[op][0],y+d[op][1]
                if 0 <= x < n and 0<= y < n:tmp += 1 # 未出界+1
                else:break # 出界直接停止
            ans.append(tmp)
        return ans

5965. 相同元素的间隔之和

大佬写的:执行用时: 320 ms,内存消耗: 48.4 MB

class Solution:
    def getDistances(self, arr: List[int]) -> List[int]:
        d, res = defaultdict(list), [0] * len(arr)
        for i, x in enumerate(arr): d[x].append(i)
        for x in d:
            pi, n, c = 0, len(d[x]), sum(d[x])
            for i, pn in enumerate(d[x]): res[(pi := pn)] = (c := c - (n - 2 * i) * (pn - pi))
        return res

5966. 还原原数组

大佬写的:执行用时: 5256 ms,内存消耗: 16.2 MB

class Solution:
    def recoverArray(self, nums: List[int]) -> List[int]:
        nums.sort()
        x2i = defaultdict(list)
        for i, x in enumerate(nums):
            x2i[x].append(i)
        n = len(nums)
        for i in range(n//2-1, n-1):
            k_ = nums[-1] - nums[i]
            if k_ % 2:
                continue
            x2i_ = copy.deepcopy(x2i)
            valid = [True for _ in range(n)]
            ans = []
            for j in range(n-1):
                if valid[j]:
                    target = nums[j]+k_
                    if len(x2i_[target]) >= 1:
                        ans.append(nums[j]+k_//2)
                        idx = x2i_[target].pop()
                        valid[idx] = False
                    else:
                        break
            if len(ans) == n//2:
                return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值