代码随想录算法训练营第三十二天 | 利润题、覆盖范围题

news2024/12/22 20:40:26

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

文档讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili

状态:根本做不出来,思路太巧了。

思路

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

**其实最终利润是可以分解的,那么本题就很容易了!**如何分解呢?

第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])。如图,利润的序列比股票序列少一天!

在这里插入图片描述

从图中可以发现,其实我们需要收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间。那么只收集正利润就是贪心所贪的地方!

局部最优:收集每天的正利润,全局最优:求得最大利润

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

55. 跳跃游戏

文档讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,怎么跳跃不重要,关键在覆盖范围 | LeetCode:55.跳跃游戏_哔哩哔哩_bilibili

状态:想不出来。

思路

刚看到本题一开始可能想:当前位置元素如果是3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?

其实跳几步无所谓,关键在于可跳的覆盖范围!不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。这个范围内,别管是怎么跳的,反正一定可以跳过来。

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

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

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

在这里插入图片描述

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

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

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

代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;
        if (nums.size() == 1) return true; // 只有一个元素,就是能达到
        for (int i = 0; i <= cover; i++) { // 注意这里是小于等于cover
            cover = max(i + nums[i], cover);
            if (cover >= nums.size() - 1) return true; // 说明可以覆盖到终点了
        }
        return false;
    }
};

45.跳跃游戏II

文档讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,最少跳几步还得看覆盖范围 | LeetCode: 45.跳跃游戏II_哔哩哔哩_bilibili

状态:方法1想到了。

思路

本题相对于55.跳跃游戏 (opens new window)还是难了不少。但思路是相似的,还是要看最大覆盖范围。

本题要计算最小步数,那么就要想清楚什么时候步数才一定要加一呢?

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

真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!

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

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

在这里插入图片描述

本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最小步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。

代码

class Solution {
public:
    int jump(vector<int>& nums) {
        int step = 0;   //记录走的步数
        int curDis = 0, nextDis = 0;    //当前覆盖最远距离下标、下一步覆盖最远距离下标
        for(int i = 0; i < nums.size(); i++){
            nextDis = max(i + nums[i], nextDis);    // 更新下一步覆盖最远距离下标
            if(i == curDis){    // 遇到当前覆盖最远距离下标
                if(i >= nums.size() - 1) break; // 当前覆盖最远距到达集合终点,不用做ans++操作了,直接结束
                else{   // 如果当前覆盖最远距离下标不是终点
                    curDis = nextDis;   // 更新当前覆盖最远距离下标
                    ++step;     // 需要走下一步
                }
            }
        }
        return step;
    }
};

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

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

相关文章

浅谈Java、PHP、C++编程的优缺点

Java 、PHP、C 编程语言都是非常流行的编程语言&#xff0c;在开发、Web 开发、移动应用开发等领域都有广泛的应用。本文将从以下几个方面分析 Java、PHP、C 编程语言的优缺点。 一、Java 编程语言的优缺点 优点 &#xff08;1&#xff09;具有跨平台特性&#xff0c;能够在不…

Java8中DateTimeFormatter真的是线程安全的吗?

文章目录 [toc] 1.背景2.解决办法2.1办法一&#xff1a;换姿势或者升级JDK的版本2.1办法二&#xff1a;更换文件名称字生成策略 Java8中DateTimeFormatter真的是线程安全的吗&#xff1f; 答案是否定的 1.背景 由于之前写了一个旷世的ocr的服务,接入了旷世的FaceID的人脸比对…

初识WebAssembly

WebAssembly是一种新型的低级字节码格式&#xff0c;它可以在现代的浏览器中运行&#xff0c;同时也支持其它的平台&#xff0c;例如Node.js、Web Worker等。WebAssembly的目标是在Web平台上提供一种高效、安全、可移植的运行时环境&#xff0c;可以被用于执行任意类型的二进制…

ChatGPT实现leetcode 刷题和变型

leetcode 刷题和变型 作为一个程序员&#xff0c;Leetcode 是一个非常重要的网站。它不仅可以帮助程序员提高算法和数据结构的能力&#xff0c;还能帮助我们准备技术面试。但是&#xff0c;刷 Leetcode 也需要花费大量的时间和精力来解决各种难题。那么&#xff0c;有没有什么…

达成事务条件的实现原理

事务存在的意义&#xff1a;保证系统中的数据&#xff0c;都是符合预期的&#xff1b;相互关联的数据之间&#xff0c;不会产生矛盾 达成事务的条件 原子性&#xff1a;一个操作&#xff0c;要么同时成功、要么同时失败 隔离性&#xff1a;各业务&#xff0c;读写相互独立 持…

arm 源码编译kernel 对比image zimage uimage vmlinux

一 源码编译kernel 下载交叉编译工具链 下载cc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz &#xff0c;这是官网的。使用下面命令下载。 585 wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9…

每天一道算法练习题--Day22 第一章 --算法专题 --- ----------最大公约数

关于最大公约数有专门的研究。 而在 LeetCode 中虽然没有直接让你求解最大公约数的题目。但是却有一些间接需要你求解最大公约数的题目。 如何求最大公约数&#xff1f; 定义法 def GCD(a: int, b: int) -> int:smaller min(a, b)while smaller:if a % smaller 0 and b …

一个集团企业,如何从0到1构建信息化系统?

当今时代&#xff0c;信息技术已经成为企业发展不可或缺的一部分&#xff0c;特别是对于一个大型集团公司来说&#xff0c;如何构建一个高效的信息化系统对于其业务发展至关重要。 我们想要构建一个优质高效的信息化系统&#xff0c;首先需要了解现在大的趋势是怎样的。 目前…

【Linux】Linux安装Java环境(OpenJDK)

文章目录 第一步&#xff1a;第二步&#xff0c;选择合适的版本安装&#xff1a;第四步&#xff0c;配置环境变量 linux环境为CentOS7.8 版本。 今天教大家怎么在CentOs环境中安装Java的开发环境。 在安装java之前我们先来了解一下YUM Yum&#xff08;全称为 Yellow dog Updat…

【JavaEE初阶】简单了解wait和notify方法~

目录 &#x1f31f;1、wait() &#x1f31f;2、notify() &#x1f31f;1、wait() &#xff08;1&#xff09;wait()方法与notify()方法都是Object类中的方法。 &#xff08;2&#xff09;wait()是让线程等待一段时间&#xff0c;死等——>状态WAITING:没有时间限制的等待.…

C++ | 语句的基础知识(夯实基础)

本文概要 本篇文章主要介绍数据结构中C的语句内容&#xff0c;适合有零基础的同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f…

CentOS 7.x 安装 ZooKeeper 并实现集群搭建

0. 集群结构 服务器IPhostname节点说明192.168.31.101master主节点192.168.31.102slave1从节点192.168.31.103 slave2 从节点 下面的安装与配置操作需要在三台服务器上都执行一遍。 1. 安装JDK ZooKeeper要求运行在 JDK 环境上&#xff0c;JDK安装教程可参考 CentOS 7.x 安装…

从点赞到数字货币:揭秘Diem币与Facebook的联系

大家都知道Facebook是一个全球知名的社交媒体平台&#xff0c;但你是否听说过与Facebook有关的数字货币Diem币呢&#xff1f;或许你会想&#xff0c;从点赞到数字货币&#xff0c;这是怎么回事&#xff1f;别着急&#xff0c;让我们一起揭秘Diem币与Facebook的联系。 首先&…

IP一键呼叫语音对讲怎么样?

IP一键呼叫语音对讲怎么样&#xff1f; IP一键呼叫语音对讲&#xff0c;让您的生活更加便利和安全&#xff01; 无需复杂设置&#xff0c;轻松实现远程通话&#xff0c;随时随地与家人朋友沟通交流。APP端可实时监控家庭动态&#xff0c;保证家庭安全。 一键呼叫语音功能&am…

微信小程序——自定义组件

自定义组件 一、组件的创建二、组件的引用1、全局引用2、局部引用 三、全局引用和局部引用 一、组件的创建 第一步&#xff1a;在项目的根目录下创建文件夹components。 第二步&#xff1a;在components文件夹下创建文件夹card。 第三步&#xff1a;选中文件夹card 右键 选中…

openwrt广告屏蔽大师修复补丁luci-app-adbyby plus + lite

openwrt广告屏蔽大师修复补丁 目前使用方式然而有规则无法下载的通病所以可以手工拷贝随便哪里来的规则最后提示 补丁位置 &#xff1a; 地址 http://pan.ezdial.cn/nasone/a 备用&#xff1a;https://bak.ezdial.cn:8000/bakone/a 因什么值得买&#xff0c;在反复审核本文&…

如何在 AlmaLinux 8 上安装和使用 Docker

Docker 是面向开发人员和系统管理员的强大平台&#xff0c;可简化在软件容器内部署应用程序的过程。 容器允许您将应用程序及其所有部分(代码、运行时、系统工具、系统库——通常位于 /usr/bin 或 /usr/lib 中的任何内容)打包&#xff0c;以便它可以在任何 Linux 机器上一致地运…

Linux性能参数调优

内核的shmall和shmmax参数 SHMMAX配置了最大的内存segment的大小&#xff1a;这个设置的比SGA_MAX_SIZE大比较好。 SHMMIN最小的内存segment的大小 SHMMNI整个系统的内存segment的总个数 SHMSEG每个进程可以使用的内存segment的最大个数 配置信号灯&#xff08; semphore …

微软 New Bing, Chat AI 绘图火力全开

嗯&#xff0c;今天的主角是&#xff0c; Microsoft New Bing! 在 Edge 里面&#xff0c;访问 www.bing.com&#xff0c;登录 Microsoft 账户&#xff0c;点击 CHAT, 就可以体验 Bing Chatbot. 这次, New Bing 无需加入 waitlist, 即可全面体验 ChatGPT DALL-E 的绘图功能 关键…

1、防刷限流实现1

1、本章诉求 限流的需求出现在许多常见的场景中&#xff1a; 秒杀活动&#xff0c;有人使用软件恶意刷单抢货&#xff0c;需要限流防止机器参与活动某api被各式各样系统广泛调用&#xff0c;严重消耗网络、内存等资源&#xff0c;需要合理限流 2、流程设计 3、方案实现 3.1…