每日一题 力扣1696跳跃游戏

1696. 跳跃游戏 VI

题目描述:

给你一个下标从 0 开始的整数数组 nums 和一个整数 k

一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i + 1, min(n - 1, i + k)] 包含 两个端点的任意位置。

你的目标是到达数组最后一个位置(下标为 n - 1 ),你的 得分 为经过的所有数字之和。

请你返回你能得到的 最大得分

示例 1:

复制代码
输入:nums = [1,-1,-2,4,-7,3], k = 2
输出:7
解释:你可以选择子序列 [1,-1,4,3] (上面加粗的数字),和为 7 。

示例 2:

复制代码
输入:nums = [10,-5,-2,4,0,3], k = 3
输出:17
解释:你可以选择子序列 [10,4,3] (上面加粗数字),和为 17 。

示例 3:

复制代码
输入:nums = [1,-5,-20,4,-1,3,-6,-3], k = 2
输出:0

提示:

  • 1 <= nums.length, k <= 10^5
  • -10^4 <= nums[i] <= 10^4

思路:

1.动态规划:双重循环,动态规划,dp[i]代表跳到i位置获得的最大分值;

递归式:dp[i]=max(dp[i],max(dp[j]+nums[i])) 其中j∈(i-k,i)

代码:

class Solution:
    def maxResult(self, nums: List[int], k: int) -> int:
        n = len(nums)
        map = [-10 ** 10] * n
        map[0] = nums[0]
        for i in range(1,n):
            for j in range(max(i-k,0),i):
                map[i] = max(map[i],map[j] + nums[i])
        print(map)
        return map[n-1]

超时了!

仔细想一想,这个复杂度其实体现在了对于i位置前k个位置里的最大得分的计算上,联想一下,这个其实和滑动窗口类似,因此我们借鉴之前滑动窗口的方法来确定该值,降低时间复杂度!

class Solution:
    def maxResult(self, nums: List[int], k: int) -> int:
        n = len(nums)
        f = [0] + [-inf]*n
        q = deque()
        for i,x in enumerate(nums,1):
            # 保持窗口大小为k
            while q and i - q[0] > k:
                q.popleft()
            
            # 更新答案
            f[i] = f[q[0]] + x if q else x

            # 去除窗口内无用数据
            while q and f[q[-1]] <= f[i]:
                q.pop()
            # 入队
            q.append(i)
            
        return f[-1]
相关推荐
小沈熬夜秃头中୧⍤⃝6 分钟前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
木向39 分钟前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越41 分钟前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
skaiuijing1 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核
Star Patrick1 小时前
算法训练(leetcode)二刷第十九天 | *39. 组合总和、*40. 组合总和 II、*131. 分割回文串
python·算法·leetcode
武子康2 小时前
大数据-214 数据挖掘 机器学习理论 - KMeans Python 实现 算法验证 sklearn n_clusters labels
大数据·人工智能·python·深度学习·算法·机器学习·数据挖掘
DisonTangor3 小时前
微软的新模拟器将为 Windows on Arm 带来更多游戏
arm开发·游戏·microsoft
m0_571957585 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
pianmian17 小时前
python数据结构基础(7)
数据结构·算法
好奇龙猫9 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法