代码随想录第32天|● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

本文介绍了两种股票买卖的贪心算法以及动态规划解法,以及一个跳跃游戏中的贪心找最大范围和记录覆盖范围的方法,以及处理特殊情况的方法二。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

买卖股票

在这里插入图片描述

思路一:贪心

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

代码:

// 贪心思路
class Solution {
    public int maxProfit(int[] prices) {
        int result = 0;
        for (int i = 1; i < prices.length; i++) {
        //如果为正
            result += Math.max(prices[i] - prices[i - 1], 0);
        }
        return result;
    }
//或者
class Solution {
    public int maxProfit(int[] prices) {
        int res=0;
        for(int i=1;i<prices.length;i++){
      		//如果递增
            if(prices[i]>prices[i-1]){
                res+=prices[i]-prices[i-1];
            }
        }
        return res;


    }
}

思路:动态规划

在这里插入图片描述

代码:

class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp=new int[prices.length][2];
        dp[0][0]=-prices[0];
        dp[0][1]=0;
        for (int i = 1; i < prices.length; i++) {
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]);
        }
        return Math.max(dp[prices.length-1][0],dp[prices.length-1][1]);
    }
}

跳跃游戏

在这里插入图片描述

思路:贪心找最大范围

在这里插入图片描述
在这里插入图片描述

代码:

class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 1) {
            return true;
        }
         //覆盖范围, 初始覆盖范围应该是0,因为下面的迭代是从下标0开始的
        int cover=0;
        //在覆盖范围内更新最大的覆盖范围
        for(int i=0;i<=cover;i++){
            cover=Math.max(cover,i+nums[i]);
            //cover:当前步数覆盖范围 i+nums[i]扩展范围
            if(cover>=nums.length-1)return true;
        }
        return false;
    }
}

跳跃游戏②

在这里插入图片描述

思路:

在这里插入图片描述
记录这一步的最大覆盖范围,在这个覆盖范围里,去找里面包含的(下一步能达到的最大覆盖范围)。按照最大覆盖范围去跳,次数就会最少。
每找到一次覆盖范围则相当于跳跃了一次
在这里插入图片描述
在这里插入图片描述

代码:

遇到终点则停止

class Solution {
    public int jump(int[] nums) {
        if (nums.size() == 1) return 0;//单一数组
        int curdis=0;  // 当前覆盖最远距离下标
        int nextdis=0; // 下一步覆盖最远距离下标
        int ans=0;  // 记录走的最大步数
        for (int i = 0; i < nums.length; i++) {
            nextdis=Math.max(nextdis,i+nums[i]);// 更新下一步覆盖最远距离下标
            if(i==curdis){ // 遇到当前覆盖最远距离下标
                ans++;
                curdis = nextdis;
                if(nextdis>=nums.length-1)break;
            }
        }
        return ans;
    }
}

方法二:处理方法一的特殊情况

// 版本二
class Solution {
    public int jump(int[] nums) {
        int result = 0;
        // 当前覆盖的最远距离下标
        int curdis = 0;
        // 下一步覆盖的最远距离下标
        int nextdis = 0;
        for (int i = 0; i < nums.length - 1; i++) {
            nextdis = Math.max(nextdis, i + nums[i]);
            // 可达位置的改变次数就是跳跃次数
            if (i == curdis) {
                curdis = nextdis;
                result++;
            }
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值