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

news2024/10/6 20:05:52

参考

代码随想录

题目一:LeetCode 122.买卖股票的最佳时机II

按照自己的想法,无非就是在最低点买入,在最高点卖出,因此只需要找到成对的极小值和极大值,就可以计算利润了。代码实现如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int index = 0;
        int profit = 0;
        bool flag1,flag2;
        int value1,value2;
        vector<pair<int,int>> vec;
        while(index < prices.size()){
            flag1 = flag2 = false;
            //求极小值
            value1 = prices[index];
            for(;index < prices.size(); index++){
                if(prices[index] <= value1) value1 = prices[index]; //这里要包含等号
                else{ //下一个值比当前极小值大,说明已经找到了极小值
                    flag1 = true;
                    break;
                }
            }
            //求极大值
            value2 = value1;
            for(;index < prices.size(); index++){
                if(prices[index] >= value2){ //这里要包含等号
                    value2 = prices[index]; 
                    if(index == prices.size()-1) //右边界处理   
                        flag2 = true;   
                }
                else{
                    flag2 = true;
                    break;
                }
            }
            //保存极值
            if(flag1 && flag2) vec.push_back(pair<int,int>(value1,value2));
            else break;  //找不到一组极值,退出 
        }
        for(int i = 0; i < vec.size(); i++)
            profit = profit - vec[i].first + vec[i].second;
        return profit;      
    }
};  

上面的求解过程只关注了极小值和极大值两个点,但其实利润是可以分解的,从极小值到极大值的过程中,每天都是正利润,例如求prices[4]-prices[1],完全可以分解为(prices[4]-prices[3]) + (prices[3]-prices[2]) + (prices[2]-prices[1]),这样只需要关注当天相对于前一天的利润。按照分解利润的思想,不再需要求极值点,而只需要关注当前相对于前一天的利润,而且我们只需要关注正利润,这就是贪心所贪的地方。代码实现如下:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int profit = 0;
        for(int i = 1; i < prices.size(); i++)
            profit += max(prices[i]-prices[i-1],0);
        return profit;
    }
};

题目二:LeetCode 55. 跳跃游戏

因为这个题问的是能不能跳到最后一个位置,因此只需要做判断就可以了,不必关心具体的路径。每个位置给出了能跳的最大长度,将每个位置的最大长度转化成一个范围,最终判断这个范围能不能覆盖最后一个位置就可以了。
在这里插入图片描述
如上图所示,左图能覆盖终点,而右图不能覆盖终点。

但其实不必列出所有位置的覆盖范围,只需要每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。如下图所示:
在这里插入图片描述

在代码实现上,i每次移动只能在cover的范围内移动,每移动一个元素,cover得到该元素数值(新的覆盖范围)的补充,让i继续移动下去。

而cover每次只取 max(该元素数值补充后的范围, cover本身范围)。

如果cover大于等于了终点下标,直接return true就可以了。

代码实现如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;
        for(int i = 0; i <= cover; i++){
            cover = max(i+nums[i],cover);
            if(cover >= nums.size()-1) return true;
        }
        return false;
    }
};

题目三:LeetCode 45. 跳跃游戏II

局部最优:当前可移动距离尽可能多走,如果还没到终点,步数再加一。
整体最优:一步尽可能多走,从而达到最小步数。

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

这里有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时

  • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
  • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
class Solution {
public:
    int jump(vector<int>& nums) {
        int curDistance = 0, nextDistance = 0;
        int step = 0;
        for(int i = 0; i < nums.size(); i++){
            nextDistance = max(i+nums[i],nextDistance);
            if(i == curDistance){
                if(curDistance != nums.size()-1){
                    step++;
                    curDistance = nextDistance;
                    if(nextDistance >= nums.size()-1)   break;
                }
                else break;
            }
        }
        return step;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用姿势估计构建 姿势校正器

我们中的许多人大部分时间都在办公桌前弯腰驼背&#xff0c;身体前倾看着电脑屏幕&#xff0c;或者瘫坐在椅子上。如果你像我一样&#xff0c;只有当你的脖子或肩膀在数小时后受伤&#xff0c;或者你有偏头痛时&#xff0c;你才会想起你的不良姿势。如果有人可以提醒您坐直不是…

SpringBoot配置文件(学习笔记)

目录 一、配置文件概述 配置文件的作用 配置文件的格式 二、application.properties 配置文件 基本语法 读取配置文件 三、application.yml 配置文件 基本语法 读取yml中的配置 1、yml配置的简单读取 2、读取yml 配置中不同数据类型及 null​编辑 2、读取yml配置文…

Python基础知识入门(三)

Python基础知识入门&#xff08;一&#xff09; Python基础知识入门&#xff08;二&#xff09; 一、元组类型 元组是用英文小括号 () 把所有元素包裹起来&#xff0c;元组里面的每一个数据叫作元素。每个元素之间都要用 英文逗号 ( , ) 隔开。例如&#xff1a;(1,2,3)。 注意…

Head First设计模式(阅读笔记)-04.工厂模式

披萨订购 假设要完成披萨订购的功能&#xff0c;披萨的种类很多&#xff0c;比如 GreekPizz、CheesePizz 等&#xff0c;披萨店会根据用户需要的披萨种类制作披萨&#xff0c;制作的流程包括prepare->bake->cut->box 简单实现 下面代码的实现十分简单清晰&#xff0c;…

从0到0.1学习 lambda表达式(Java版)

编码几年时间&#xff0c;有一个东西似乎一直也逃不过去&#xff0c;那就是lambda表达式。 无论是c#&#xff0c;Python还是Java&#xff0c;lambda的思想都是共通的。但以下的语法和实例为java。 现在就来说说这个看似很难的lambda表达式 什么是lambda表达式&#xff1f; l…

【owt-server】m88分支和m59-server

OWT 单独有个webrtc的仓库,里面有m88的分支Merged Upgrade sdk to m88 for webrtc node #1026 提交记录 主干merge Merge pull request #1026 from starwarfan/mst-88webrtc-m88 目录 构建修改

【信管2.2】项目管理知识体系与组织结构

项目管理知识体系与组织结构上一次课中&#xff0c;我们已经学过了项目以及项目管理的概念&#xff0c;这些内容帮我们认识到了项目到底是个什么东西&#xff0c;有什么特点&#xff0c;和运营有什么区别等等。今天我们就继续沿着项目这件事说下去&#xff0c;我们将一起探讨一…

【知识网络分析】共引网络(co-citation)

共引网络(co-citation) 1 读取本地文献构建共引网络数据集2 网络数据集精简3 社团群体划分4 节点中心度相关指标计算1 读取本地文献构建共引网络数据集 RC.networkCoCitation()方法中的参数与RC.networkCitation()方法中的参数功能一致。该案例中使用的数据集同样为2020-202…

SpringBoot框架保姆级笔记一看就会

文章目录 文章目录文章目录[toc]1️⃣ 简介一. 什么是 [IoC](https://so.csdn.net/so/search?qIoC&spm1001.2101.3001.7020) 容器&#xff1f;二. AOP面向切面编程三. SSM整合四. HttpServletRequest五. HttpServletResponse六. Cookie 与 Session七. Cookie八. Session九…

Java异常01:Error 和 Exception

什么是异常 # 实际工作中&#xff0c;遇到的情况不可能是非常完美的。比如&#xff1a;你写的某个模块&#xff0c;用户输入不一定符合你的实际要求、你的程序要打开某个文件&#xff0c;这个文件可能不存在或者文件格式不对&#xff0c;你要读取数据库的数据&#xff0c;数据…

最全面的SpringMVC教程(一)——SpringMVC简介

前言 本文为SpringMVC相关教程&#xff0c;下边将对SpringMVC进行简单介绍&#xff0c;具体包含&#xff1a;对MVC架构的回顾&#xff0c;什么是SpringMVC&#xff0c;SpringMVC编程示例&#xff08;包含配置版示例、注解版示例&#xff09;&#xff0c;初识SpringMVC&#xff…

NM DEV Mathematics for Java 【suanshu.net免费】

NM Dev是一个面向对象、高性能、经过广泛测试和专业记录的数学编程库&#xff0c;在S2上运行。自 2010 年开发以来&#xff0c;它是大量经过编码的数值算法&#xff0c;因此它们是可靠的面向对象、统一和可测试的。编程经验或数学知识很少的用户可以通过快速组合类轻松地为他或…

备战 2023 春招,P7 大咖手打 26 大后端面试专题神技,1500 题解析助力

年过后&#xff0c;不少人已经蓄势待发&#xff0c;信心满满地准备投递简历&#xff0c;到处面试&#xff0c;在不同的 Offer 之中择优而栖。 与此同时&#xff0c;也有人会悔恨自己这半年进步不大&#xff0c;每天噼里啪啦敲代码&#xff0c;但面对那些不能再熟悉的 Java 面试…

大数据毕设选题 - 生成对抗网络的照片上色动态算法设计与实现(深度学习 opencv python)

文章目录1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理3 DeOldify 框架4 First Order Motion Model1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始…

Linux项目后端部署及JDKTomcatMySQL安装

前言 上一篇文章简单的分享了在VMware上安装linux系统&#xff0c;本篇文章将要分享的内容是使用linux系统完成项目的部署 一、前置准备工作 在Windows系统中&#xff0c;我们要在开发环境下才能进行项目的开发。那么在linux系统中也是&#xff0c;在安装完linux系统后&#xf…

NoSuchMethodError的常见原因和通用解决方式

目录 环境信息 问题描述 错误分析 解决方法 常见原因 1.第三方包&#xff0c;作用域不对导致应用没导入该包 2.编译时和运行时使用的版本不一样 3.JDK版本不一样 4.多个同路径、同名的类 1.代码复制场景 2.代码移动场景 排查步骤 附录 Maven仲裁机制&#xff1a; …

为啥这么人选择iPhone

01.听音乐&#xff08;10元/月&#xff09; 歌曲很全 多个终端支持 果子自带的Music app 在那个设备都可以使用&#xff0c; 包括MacBook Pro,iPhone&#xff0c;iPad&#xff0c;iwatch等 02.周边配件方便购买 03.遇到问题好解决 04.使用稳定&#xff0c;不会有广告&#x…

MySQL海量数据优化(理论+实战) 吊打面试官

一、准备表数据 咱们建一张用户表&#xff0c;表中的字段有用户ID、用户名、地址、记录创建时间&#xff0c;如图所示 ​OK&#xff0c;接下来准备写一个存储过程插入一百万条数据 CREATE TABLE t_user (id int NOT NULL,user_name varchar(32) CHARACTER SET utf8 COLLATE ut…

[附源码]Python计算机毕业设计防疫物资捐赠系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

Vue组件化编程开发

目录 一.模块 二.组件 &#xff08;快捷键< 回车 生成单组件模板&#xff09; 三.非单文件组件 四.单文件组件: 首先理解模块和组件的基本概念: 一.模块 1.理解:向外提供特定功能的js程序&#xff0c;一般就是一个js文件 2.为什么: js文件很多很复杂 3.作用:复用js, 简…