LeetCode笔记:Weekly Contest 261

Posted 墨客无言

tags:

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

1. 题目一

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

1. 解题思路

这一题我们用贪婪算法即可求解。

我们从左向右遍历,如果发现一个X,就需要进行一次变换,此时无论后方字母是啥,后续两个字符都会被修正,因此我们只需要继续从i+3个位置开始考察即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumMoves(self, s: str) -> int:
        i, n = 0, len(s)
        res = 0
        while i < n:
            if s[i] == "O":
                i += 1
            else:
                res += 1
                i += 3
        return res

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

2. 题目二

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

1. 解题思路

这一题我们很容易就能够计算出剩余没有出现的n个元素的总和,记为s,显然,如果 s > 6 n s > 6n s>6n或者 s < n s < n s<n,那么显然无法构造成功,而如果 s = 6 n s = 6n s=6n,那么只有一种构造方式,即所有的元素都为6。

对于剩下的情况,我们总可以给出一种构造方式为a个6,c个1以及剩下一个元素b。

此时我们可以给出条件如下:
{ 6 a + b + c = s a + 1 + c = n \\left\\{ \\begin{aligned} 6a + b + c & = s \\\\ a + 1 + c & = n \\end{aligned} \\right. {6a+b+ca+1+c=s=n

此时我们计算即可得到abc的结果。

2. 代码实现

给出python代码实现如下:

class Solution:
    def missingRolls(self, rolls: List[int], mean: int, n: int) -> List[int]:
        m = len(rolls)
        s = (n+m) * mean - sum(rolls)
        if s > 6 * n or s < n:
            return []
        elif s == 6*n:
            return [6] * n
        a = (s-n) // 5
        c = n -1 - a
        b = s - 6*a - c
        return [6] * a + [b] + [1] * c

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

3. 题目三

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

1. 解题思路

这一题考察的其实就是一个必胜策略。

由于我们考虑的是和对于3的余数,因此,我们事实上只要考虑所有数字对于3的余数,然后进行数目统计即可。

要想使得游戏继续,刨除掉余数为0的情况,可能的序列只有两种:

  1. 1121212121212……
  2. 2212121212121……

我们分别考虑先取1或者先取2的情况,而对于每一种情况。

我们首先考虑先取1的情况,此时又需要考虑余数为0的情况,如果其数量模2为0,那么就可以直接忽略,因为无论如何Alice都可以将情况恢复至变换之前,因此,Alice要取的永远都是2,我们只需要2的数目多于剩余的1的数目即可;反之,如果模为1,那么情况就会反转,Alice要取的数会变成1,此时我们要求1的数目至少需要比2的数目多2。

同理,我们可以分析得到先取2时的情况。

2. 代码实现

给出python代码实现如下:

class Solution:
    def stoneGameIX(self, stones: List[int]) -> bool:
        cnt = defaultdict(int)
        for k in stones:
            cnt[k % 3] += 1
        
        if cnt[1] > 0:
            if cnt[0] % 2 == 0:
                if cnt[2] > cnt[1]-1:
                    return True
            else:
                if cnt[1]-2 > cnt[2]:
                    return True
        if cnt[2] > 0:
            if cnt[0] % 2 == 0:
                if cnt[1] > cnt[2]-1:
                    return True
            else:
                if cnt[2]-2 > cnt[1]:
                    return True
        
        return False

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

4. 题目四

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

pass

这一题不想看了,算是休息一下吧。

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

LeetCode笔记:Weekly Contest 317

LeetCode笔记:Weekly Contest 288

LeetCode笔记:Weekly Contest 299

LeetCode笔记:Weekly Contest 307

LeetCode笔记:Weekly Contest 325

LeetCode笔记:Weekly Contest 314