LeetCode跳跃游戏 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

1696. 跳跃游戏 VI

解题思路

本题需要我们求解跳跃的最大解,这很明显是使用贪心或动态规划,使用贪心考虑显然不太合理,因为我们无法保证其选择步数合理范围最大就是最大解如:1,1,1,1,1,2,k=5,显然如果按照贪心我们会选择2,但其实我们完全可以每次走一步,即可获取最大解。

所以本题其实本质就是一个动态规划问题,每次选取步数中最大作为本位置的最大解。

如此我们每次向前步数搜索最大即可,代码如下

java 复制代码
class Solution {
    public int maxResult(int[] nums, int k) {
        int n=nums.length;
        int dp[]=new int[n];
        for(int i=1;i<n;i++)
            dp[i]=Integer.MIN_VALUE;
        dp[0]=nums[0];
        for(int i=1;i<n;i++){
            for(int j=i-k>0?i-k:0;j<i;j++){
                dp[i]=Math.max(dp[i],dp[j]+nums[i]);
            }
        }
        return dp[n-1];
    }
}

但是非常可惜,超时了,问题就集中在第二个for循环!所以我们接下来的优化就要向着如何选取步数范围的最大值,很明显我们想到使用优先队列(堆),统计在步数合理范围内的值,可直接获取这样就可以减少for循环从而节省时间。

于是修改代码如下

java 复制代码
class Solution {
    public int maxResult(int[] nums, int k) {
        int n=nums.length;
        int dp[]=new int[n];
        PriorityQueue<Jump> pq = new PriorityQueue<>();
        dp[0]=nums[0];
        pq.offer(new Jump(0,dp[0]));
        for(int i=1;i<n;i++){
            while(i-pq.peek().s>k)//如果队首超过范围,弹出
                pq.poll();
            dp[i]=pq.peek().val+nums[i];
            pq.offer(new Jump(i,dp[i]));//继续放入
        }
        return dp[n-1];
    }
}
//创建一个类,负责记录数据
class Jump implements Comparable<Jump>{
    int s;
    int val;
    public Jump(int s,int val){
        this.s=s;
        this.val=val;
    }

    public int compareTo(Jump j) {
        return Integer.compare(j.val, this.val);
    }
}
相关推荐
小O的算法实验室2 分钟前
2025年IEEE TASE,基于双层耦合平均场博弈的大规模智能体集成任务分配与轨迹规划
人工智能·算法·机器学习
8Qi87 分钟前
LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
算法·leetcode·二叉树·动态规划
地平线开发者8 分钟前
从 INT64 Div 算子约束到 Cast 修复全流程
算法
AI科技星10 分钟前
基于奇合数边界的离散解析数论与双螺旋宇宙本体大统一体系论文全部数学公式汇总表
人工智能·算法·机器学习·架构·学习方法
糖果店的幽灵14 分钟前
Pandas DataFrame 数据结构详解
数据结构·pandas
地平线开发者22 分钟前
Horizon 模型多 Batch 配置
算法·自动驾驶
czhaii34 分钟前
GB2312简体中文编码表
单片机·算法
8Qi843 分钟前
LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅
算法·leetcode·职场和发展·动态规划
一只齐刘海的猫1 小时前
【Leetcode】 接雨水
java·算法·leetcode
南境十里·墨染春水1 小时前
讲讲移动语义
算法