首页 > 编程语言 >算法训练营Day28 | leetcode 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

算法训练营Day28 | leetcode 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II

时间:2024-12-30 23:28:13浏览次数:8  
标签:游戏 nums int 位置 II prices 跳跃 覆盖范围

122.买卖股票的最佳时机II

本题首先要清楚两点:

  • 只有一只股票!
  • 当前只有买股票或者卖股票的操作

想获得利润至少要两天为一个交易单元。

贪心算法

这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入…循环反复。

如果想到其实最终利润是可以分解的,那么本题就很容易了!

如何分解呢?

假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。

相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。

此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑!

那么根据 prices 可以得到每天的利润序列:(prices[i] - prices[i - 1])…(prices[1] - prices[0])。

如图:
image.png

Java

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;
    }
}

可以看出有时候,贪心往往比动态规划更巧妙,更好用,所以别小看了贪心算法

55.跳跃游戏

思路

刚看到本题一开始可能想:当前位置元素如果是 3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?
其实跳几步无所谓,关键在于可跳的覆盖范围!
不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。
这个范围内,别管是怎么跳的,反正一定可以跳过来。

那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!

每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

Java

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length  == 1) return true;
        int cover = 0;
        for(int i = 0; i <= cover; i++) {
            cover = Math.max(cover, i + nums[i]);
            if(cover >= nums.length - 1) return true;
        }
        return false;
    }
}

1. 为什么是 i <= coverRange

i <= coverRange 的目的是限制迭代的范围,即只处理在当前「覆盖范围内」的位置。原因如下:

  • 覆盖范围的定义coverRange 是当前能到达的最远位置。
  • 迭代条件的含义:当遍历到某个位置 i 时,如果 i 已经超过了 coverRange(即 i > coverRange),说明从起点无法跳到位置 i,因此也不可能再向后推进,直接返回 false

换句话说,i <= coverRange 确保我们只在能到达的位置范围内更新最远跳跃范围。

2.i + nums[i] 的意思是计算从当前位置 i 最远可以跳到的位置。

  • i 是当前所在的位置索引。
  • nums[i] 是当前位置 i 上的数值,表示你在这个位置最多可以跳跃的步数。
  • i + nums[i] 就是从位置 i 最远可以到达的位置。

例子

假设 nums = [2, 3, 1, 1, 4],逐步分析 i + nums[i] 的作用:

  1. 第 0 步 (i = 0):
    • 当前 nums[0] = 2,所以从位置 0 最远可以跳到 0 + 2 = 2
  2. 第 1 步 (i = 1):
    • 当前 nums[1] = 3,所以从位置 1 最远可以跳到 1 + 3 = 4
  3. 第 2 步 (i = 2):
    • 当前 nums[2] = 1,所以从位置 2 最远可以跳到 2 + 1 = 3

i + nums[i] 用于动态计算当前能到达的最大范围,以便更新 coverRange(当前覆盖范围)。

45.跳跃游戏II

思路

贪心的思路,局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最少步数。
要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

Java

class Solution {
    public int jump(int[] nums) {
        if(nums.length == 1 || nums.length == 0 || nums == null) return 0;
        int cur = 0; // 当前跳跃覆盖的最远位置
        int next = 0; // 下一次跳跃覆盖的最远位置
        int count = 0; // 跳跃次数
        for(int i = 0; i < nums.length; i++) {
            next = Math.max(next, i + nums[i]);
            if(i == cur) {
                if(cur != nums.length - 1) {
                    count++;
                    cur = next;
                    if(cur >= nums.length - 1) break;  // 如果已经可以到达终点,提前结束
                }else {
                    count++;
                    break;
                }
            }
        }
        return count;
    }
}

标签:游戏,nums,int,位置,II,prices,跳跃,覆盖范围
From: https://blog.csdn.net/2302_81139517/article/details/144835832

相关文章

  • 使用深度Q学习(DQN)训练飞机大战游戏智能体
    引言在强化学习领域,深度Q学习(DeepQ-Network,DQN)是一种非常流行的算法,它结合了Q学习和深度神经网络,能够处理高维状态空间的问题。本文将介绍如何使用DQN算法来训练一个飞机大战游戏的智能体,并附上完整的代码实现。  代码参考:https://download.csdn.net/download/weixin_74......
  • 【网页设计期末/课程设计】类Steam的游戏商城(纯前端)
    代写C语言、C++、Java、Python、HTML、JavaScript、vue、MySQL相关编程作业,长期接单,信誉有保证,如有任何问题或需要请加文章末尾推广QQ。在售模板目录:点击这里跳转本文资源:1.题目要求题目描述编写HTML项目,要求至少包含五个页面,至少实现导航栏、轮播图、下拉菜单以及......
  • 81. 搜索旋转排序数组 II
    搜索旋转排序数组II已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始......
  • leetcode137. 只出现一次的数字 II
    题目:        给你一个整数数组 nums,除某个元素仅出现一次外,其余每个元素都恰出现三次。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。示例1:输入:nums=[2,2,3,2]输出:3示例2:输入:nums=[......
  • leetcode 213. 打家劫舍 II
    213.打家劫舍II与  198.打家劫舍  相比,多了首和尾不能同时偷的条件但是没写出来......
  • 资料DRV8210PDSGR 12V 电机驱动器、THGBMJG6C1LBAB7 高性能e-MMC存储器、LAN7800-I/Y9
    DRV8210PDSGR12V、1AH桥电机驱动器说明:DRV8210P是一款集成电机驱动器,具有4个N沟道功率FET、电荷泵稳压器和保护电路。三倍电荷泵架构允许该器件在低至1.65V的电压下工作,以适应1.8V电源轨和低电池条件。电荷泵集成了所有电容器,以减小PCB上电机驱动器的整体解决方......
  • 代码随想录——动态规划14最后一块石头的重量II(01背包)
    思路尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。背包问题:dp定义:dp[i]表示在容量为i的背包最多可放下重量为dp[i]的石头递推公式:dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]),要么不选当前的石头(沿用遍历上一个石头的情况),要么选当前的石......
  • c++《射击小游戏》
    #include<easyx.h>#include<time.h>#include<conio.h>classBullet;classTank;classE_Bullet;classBoss;booldead=false;boolwined=false;structpos//坐标类{inta;intb;};classE_Bullet//敌人打出的子弹{public:clock_td;in......
  • 射龙门‌是一种娱乐经典游戏
    射龙门‌是一种娱乐游戏,其技巧和策略主要集中在如何提高胜率、控制风险和保持良好的心态。以下是一些具体的技巧和策略:‌灵活变通‌:射龙门没有固定的公式或规律,玩家需要灵活应对不同的走势。例如,可以跟随热号和热形态,避免死磕固定的走势规律‌‌追热弃冷‌:在游戏中,热号和热形......
  • 每日算法----环形链表II(Java)
    本题在上个环形链表的基础上增加了难度,让找其环形链表的第一个节点还是原先的思路,定义快慢指针在第一次快慢指针相等时,a是到环形前的节点个数,k是离环形节点有多远快指针走了a+n圈环形+k慢指针走了a+m圈环形+k此时快指针走的路程是慢指针2倍。慢指针=快指针-慢指针=n圈......