LeetCode笔记:Weekly Contest 273

Posted Espresso Macchiato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode笔记:Weekly Contest 273相关的知识,希望对你有一定的参考价值。

1. 题目一

给出题目一的试题链接如下:

1. 解题思路

这一题其实也简单,要使得两次反转之后是同一个数,其充要条件事实上这个数最后没有多余的0,因此我们只需要考虑一下其关于10的余数即可。

2. 代码实现

给出python代码实现如下:

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

提交代码评测得到:耗时28ms,占用内存14.3MB。

2. 题目二

给出题目二的试题链接如下:

1. 解题思路

这一题坦率地说我没啥好的思路,就是暴力地一个二重循环进行实现,暴力,但是简单有效……

2. 代码实现

给出python代码实现如下:

class Solution:
    def executeInstructions(self, n: int, startPos: List[int], s: str) -> List[int]:
        m = len(s)
        res = [0 for _ in range(m)]
        for i in range(m):
            v, h = startPos
            cnt = 0
            for j in range(i, m):
                if s[j] == "L":
                    h -= 1
                elif s[j] == "R":
                    h += 1
                elif s[j] == "U":
                    v -= 1
                else:
                    v += 1
                if 0 <= v < n and 0 <= h < n:
                    cnt += 1
                else:
                    break
            res[i] = cnt
        return res

提交代码评测得到:耗时1532ms,占用内存14.4MB。

3. 题目三

给出题目三的试题链接如下:

1. 解题思路

这一题思路其实也简单,就是拆成两步来进行实现,首先我们对每一个元素的idx位置进行统计,然后对一个元素,考察其所有的idx,对每一个idx更新其值。

而这个更新的算法其实也挺简单,所有的绝对值之差的和,事实上就是考虑正负关系,用一个累积数组就可以快速搞定了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def getDistances(self, arr: List[int]) -> List[int]:
        n = len(arr)
        
        mem = defaultdict(list)
        for i, x in enumerate(arr):
            mem[x].append(i)
            
        res = [0 for _ in range(n)]
        for idxs in mem.values():
            m = len(idxs)
            s, tot = 0, sum(idxs)
            for i, idx in enumerate(idxs):
                res[idx] = tot-idx-s*2 + idx*(i - (m-1-i))
                s += idx
        return res

提交代码评测得到:耗时1260ms,占用内存47.6MB。

4. 题目四

给出题目四的试题链接如下:

1. 解题思路

这一题我的思路同样很暴力,首先最小的数一定是减去了一个k,那么我们遍历所有的元素就能得到所有可能的k值,那么剩下的我们就是考察对于任意一个给定的k,是否可以将数组进行拆分。

而这个问题就变得比较简单了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def recoverArray(self, nums: List[int]) -> List[int]:
        cnt = Counter(nums)
        keys = sorted(cnt.keys())
        
        def try_k(k):
            counter = deepcopy(cnt)
            res = []
            for x in keys:
                if counter[x+2*k] < counter[x]:
                    return []
                counter[x+2*k] -= counter[x]
                res += [x+k] * counter[x]
            return res

        
        n = len(keys)
        for i in range(1, n):
            if (keys[i] - keys[0]) % 2 == 0:
                k = (keys[i] - keys[0]) // 2
                res = try_k(k)
                if res != []:
                    return res
        return []

提交代码评测得到:耗时5084ms,占用内存15MB。

以上是关于LeetCode笔记:Weekly Contest 273的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314