LeetCode笔记:Weekly Contest 353

本文记录了LeetCode周赛353的四道题目,包括解题思路和Python代码实现。涉及动态规划解决问题的方法,如寻找最大可得数、最大跳跃次数、最长非递减子数组以及检查是否能将数组元素变为零的操作。代码执行时间与内存使用情况也一并给出。

1. 题目一

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

1. 解题思路

这一题就算放到easy的题目里面也算是简单的题目了,由于每次操作改变都是2,因此直接返回 n + 2 t n + 2t n+2t即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def theMaximumAchievableX(self, num: int, t: int) -> int:
        return num + 2 * t

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

2. 题目二

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

1. 解题思路

这一题我的思路就是一个动态规划,首先找到每一个点可以到达的下一个点的位置集合,然后用动态规划的方式考察每一次跳跃之后从下一个点到达终点所需的最大跳跃次数,然后合在一起返回最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumJumps(self, nums: List[int], target: int) -> int:
        n = len(nums)
        reachable = defaultdict(list)
        for i in range(n-1):
            for j in range(i+1, n):
                if abs(nums[i] - nums[j]) <= target:
                    reachable[i].append(j)

        @lru_cache(None)
        def dp(idx):
            if idx == n-1:
                return 0
            return max([-math.inf] + [1 + dp(i) for i in reachable[idx]])
                
        res = dp(0)
        return res if res > 0 else -1          

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

3. 题目三

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

1. 解题思路

这一题我的思路同样是走了一个比较暴力的动态规划——考察每一个点作为起点时所能够获得的非减子序列的最大长度,然后返回最大值即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maxNonDecreasingLength(self, nums1: List[int], nums2: List[int]) -> int:
        n = len(nums1)
        
        @lru_cache(None)
        def dp(idx, pre):
            if idx >= n:
                return 0
            if nums1[idx] >= pre and nums2[idx] >= pre:
                return 1 + dp(idx+1, min(nums1[idx], nums2[idx]))
            elif nums1[idx] >= pre:
                return 1 + dp(idx+1, nums1[idx])
            elif nums2[idx] >= pre:
                return 1 + dp(idx+1, nums2[idx])
            else:
                return 0
            
        return max(dp(i, 0) for i in range(n))

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

4. 题目四

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

1. 解题思路

这一题思路上还是比较直接的,就是一个greedy的算法,我们考察第一个点 x 1 x_1 x1,显然要将其全部消除,必须要 x 1 x_1 x1次操作,此时后续 k k k个点都会改变 x 1 x_1 x1,如果改变之后某一个值小于 0 0 0,那么显然无法成功,否则,数组就变成了一个 n − 1 n-1 n1长度的数组,我们重复上述操作即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def checkArray(self, nums: List[int], k: int) -> bool:
        n = len(nums)
        change = [0 for _ in range(n+1)]
        d = 0
        for i, x in enumerate(nums):
            d += change[i]
            x = x + d
            if x < 0:
                return False
            elif x > 0:
                if i + k > n:
                    return False
                change[i+k] += x
                d += -x
        return True

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值