编程语言
首页 > 编程语言> > 一起刷算法 # 动态 # 01

一起刷算法 # 动态 # 01

作者:互联网

题目

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

解题思路

这道题比较简单,因为有这个条件:假设你总是可以到达数组的最后一个位置。

那么我们只需要每次都尽量的多跳,最后一定会到达终点

那么如何每次尽量多跳呢?

在每个位置能跳到的范围内,去找能跳的最远距离。
最远距离max = j + nums[j + i];其中 j 是跳的距离,nums[i + j]是跳到的位置能跳的距离。即预期最大收益化往后跳的距离。

例如 2 3 1 1 4,对于nums[0] = 2 ,他能跳到 3 和 1.

  1. 跳到3,预期就能前进 1 + 3 = 4.
  2. 跳到1,预期就能前进 2 + 1 = 3.
    所以我们选择3.

代码

class Solution {
    public int jump(int[] nums) {
        if(nums.length <= 1)return 0;
        int[] dp = new int[nums.length];
        int max = 0;
        int ans = 0;
        
        for(int i = 0; i < nums.length; i++){
            int j = 0;
            int nextStep = 0;
            max = 0;
            if(i + nums[i] >= nums.length - 1){
                ans++;
                break;
            }
            for(; j <= nums[i];j++){
                if(j + nums[j + i] > max) {
                    nextStep = j;
                    max = j + nums[i + j];
                }
            }
            ans++;
            i = nextStep + i - 1;
        }
        return ans;
    }
}

标签:01,nums,max,位置,到达,算法,数组,ans,动态
来源: https://www.cnblogs.com/BryceTLM/p/15727369.html