LeetCode笔记:Weekly Contest 252

本文提供LeetCode Weekly Contest 252的详细解题报告,包括四个题目的解题思路和Python代码实现。涵盖质数判断、序列构建、苹果收集最优路径及特殊子序列计数等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目一

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

1. 解题思路

这一题其实可以有更优雅的解决方法的,毕竟答案必然是质数的平方数。

不过鉴于这就是一道easy的题目,我们就直接按照暴力求解的方法进行解答了。

2. 代码实现

给出python代码实线如下:

class Solution:
    def isThree(self, n: int) -> bool:
        return len([x for x in range(1, n+1) if n % x == 0]) == 3

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

2. 题目二

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

1. 解题思路

由于题目要求邻位必须不同,因此,事实上只有一种情况会导致必然存在邻位相同的情况,即存在单个数字的个数超过总数的一半以上,此时,无论怎样排列总会出现两个相邻的情况,否则的话,我们只需要不断地选择最多的一个数据然后进行插入就总能够成功构建目标序列。

因此,我们只需要对最多的一个数据进行统计即可得到最后的答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def numberOfWeeks(self, milestones: List[int]) -> int:
        s = sum(milestones)
        m = max(milestones)
        return min(s, 2*(s-m)+1)

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

3. 题目三

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

1. 解题思路

这一题事实上算是一道数列问题吧,我们很容易就能够求能够求出,当距离原点的距离从 n − 1 n-1 n1变为 n n n时,增加的苹果数目为: 12 n 2 12n^2 12n2,即总苹果数目的递推公式为: s n + 1 = s n + 12 n 2 s_{n+1} = s_n + 12n^2 sn+1=sn+12n2

求解上述数列可以得到 s n s_n sn的表达式为:
s n = 4 n 3 + 6 n 2 + 2 n s_n = 4n^3+6n^2+2n sn=4n3+6n2+2n

因此,我们就可以通过二分法快速地得到要获得目标数目的苹果数目,所需要的边长 n n n,此时最后的周长长度就是 8 n 8n 8n

2. 代码实现

给出python代码实现如下:

class Solution:
    def minimumPerimeter(self, neededApples: int) -> int:
        i, j = 0, 10**5
        while i < j-1:
            x = (i+j)//2
            s = 4*x**3+6*x**2+2*x
            if s >= neededApples:
                j = x
            else:
                i = x
        return j*8

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

4. 题目四

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

1. 解题思路

这一题一开始就想的很复杂,就是不断地去找两个中间的两个节点,然后直接计算前中后之中0,1,2的数目,不过这样的算法就是 O ( N 2 ) O(N^2) O(N2)的算法复杂度,因此怎么调整都会超时。

然后看了一下别人的解法,瞬间就被惊呆了,就是一个倒推,然后就在 O ( N ) O(N) O(N)的时间复杂度内瞬秒了,简直惊呆了。

我们首先定义三个变量 a , b , c a,b,c a,b,c,分别表示012的序列个数,12的序列个数和只有若干个2的序列个数,则我们快速地就能够得到状态转移关系:

{ a = 2 a + b x i = 0 b = 2 b + c x i = 1 c = 2 c + 1 x i = 2 \left\{ \begin{aligned} a = 2a + b & & x_i = 0 \\ b = 2b + c & & x_i = 1 \\ c = 2c + 1 & & x_i = 2 \end{aligned} \right. a=2a+bb=2b+cc=2c+1xi=0xi=1xi=2

状态转移关系也极好解释,显然当 x i = 2 x_i = 2 xi=2时,此时只和 c c c有关, c c c的总数就会变为 2 c + 1 2c+1 2c+1,分别代表保留原有的序列,在原有的序列前面多加一个 2 2 2,以及只取当前的 2 2 2这3种情况。

同样的我们就可以有另外两个状态转移公式,然后我们倒序遍历一下即可得到我们最终的结果。

2. 代码实现

给出python代码实现如下:

class Solution:
    def countSpecialSubsequences(self, nums: List[int]) -> int:
        MOD = 10**9+7
        n = len(nums)
        a, b, c = 0, 0, 0
        for i in nums[::-1]:
            if i == 2:
                c = (2 * c + 1)%MOD
            elif i == 1:
                b = (2 * b + c) % MOD
            else:
                a = (2 * a + b) % MOD
        return a

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值