LeetCode笔记:Weekly Contest 353

  • LeetCode笔记:Weekly Contest 353
    • 1. 题目一
      • 1. 解题思路
      • 2. 代码实现
    • 2. 题目二
      • 1. 解题思路
      • 2. 代码实现
    • 3. 题目三
      • 1. 解题思路
      • 2. 代码实现
    • 4. 题目四
      • 1. 解题思路
      • 2. 代码实现
  • 比赛链接:https://leetcode.com/contest/weekly-contest-353/

1. 题目一

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

  • 2769. Find the Maximum Achievable Number

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. 题目二

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

  • 2770. Maximum Number of Jumps to Reach the Last Index

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. 题目三

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

  • 2771. Longest Non-decreasing Subarray From Two Arrays

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. 题目四

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

  • 2772. Apply Operations to Make All Array Elements Equal to Zero

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。

你可能感兴趣的:(leetcode笔记,力扣周赛353,leetcode,2769,leetcode,2770,leetcode,2771,leetcode,2772)