LeetCode笔记:Weekly Contest 226 比赛记录

0. 赛后总结

这次的比赛结果只能说是反差挺大吧,这个周末算是我过的最为颓废的几个周末之一了,明明有好多想做的事,结果全被我拿来看综艺了,两天几乎废寝忘食地看完了王牌对王牌整整5季的所有剧情,真的是疯了……

结果就是现在负罪感特别深重,这还是我还单身的情况,真心想不通那些有女朋友的是怎么平衡工作、学习和生活的,我光是工作和学习都已经把自己折磨的精疲力尽了,虽然事实上我估计还是花了不少的绝对时间在休息上,但是那种负罪感几乎已经把我压崩溃了,唉,已经渐渐语无伦次不知道自己在说什么了,我觉得未来某个时间我还是去看看心理医生吧,当年在学校没有定期去看心理医生大约是我最大的失误吧……

这周要说唯一让我还算满意的事只能说这周的比赛结果了,差不多半小时左右把4道题全部做完了吧,然后世界前100了,这大约是我第二次拿到如此高的名次吧,本来应该是挺开心的一件事的,唉……

1. 题目一

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

1. 解题思路

这一题如果直接数学上解析求解的话应该会是挺难的一道题,不过在这里我的解法就比较暴力了,直接按照题意说的对范围内的每个数字进行各个位的求和然后对其进行计数就是了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countBalls(self, lowLimit: int, highLimit: int) -> int:
        def fn(x):
            res = 0
            while x != 0:
                res += x % 10
                x = x // 10
            return res
        cnt = defaultdict(int)
        for i in range(lowLimit, highLimit+1):
            cnt[fn(i)] += 1
        return max(cnt.values())

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

属于当前最优代码实现。

2. 题目二

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

1. 解题思路

这题的思路其实也是蛮直接的,显然如果给出全部的相邻关系的话,首位元素必然只会出现一次,因此,统计一下出现的次数就可以确定首尾元素,取二者之一作为第一个元素即可。

后面我们只需要通过一个链式变换就可以获取全部的元素了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def restoreArray(self, adjacentPairs: List[List[int]]) -> List[int]:
        pair = defaultdict(list)
        n = len(adjacentPairs)
        for x, y in adjacentPairs:
            pair[x].append(y)
            pair[y].append(x)
        st = sorted(pair.keys(), key=lambda x: len(pair[x]))[0]
        res = [st]
        seen = {
    
    st}
        for i in range(n):
            nxt = [x for x in pair[res[-1]] if x not in seen][0]
            seen.add(nxt)
            res.append(nxt)
        return res

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

当前最优算法实现耗时1084ms,但是算法思路是一致的。

3. 题目三

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

1. 解题思路

我们考虑每一个query,如果可以做到的充要条件为:

  1. 当每天吃一个的情况下,到目标天数时爱吃的糖果类型下的苹果数目不为0;
  2. 以每天都吃最多糖果数的情况下,到目标天数结束时不至于还无法迟到目标糖果;

因此,我们只需要事先对糖果数进行一个累积求和就可以快速地解决这个问题了。

唯一需要注意的是,题目条件要求从第0天开始……

2. 代码实现

给出python代码实现如下:

class Solution:
    def canEat(self, candiesCount: List[int], queries: List[List[int]]) -> List[bool]:
        cumsum = [0] + list(accumulate(candiesCount))
        
        def fn(query):
            idx, d, cap = query
            if d >= cumsum[idx+1]:
                return False
            elif (d+1) * cap <= cumsum[idx]:
                return False
            return True
        
        return [fn(query) for query in queries]

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

当前最有代码实现耗时1464ms,但是算法思路是一致的。

4. 题目四

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

1. 解题思路

这道题大概有更加优雅的解法,但是这里就是用缓存的方式通过递推关系给出了一个伪·动态规划算法,基本就是秒杀的样子,也没啥好多说的,看看基本也就清楚了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def checkPartitioning(self, s: str) -> bool:
        n = len(s)
        
        @lru_cache(None)
        def dp(idx, k):
            if k == 1:
                sub = s[idx:]
                return sub == sub[::-1]
            elif idx >= n:
                return False
            for j in range(idx+1, n):
                sub = s[idx: j]
                if sub == sub[::-1] and dp(j, k-1):
                    return True
            return False
        
        return dp(0, 3)

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

猜你喜欢

转载自blog.csdn.net/codename_cys/article/details/113528137