代码随想录算法训练营第三十一天丨 贪心算法part02

news2024/12/25 8:43:51

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])。

如图:

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

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

那么只收集正利润就是贪心所贪的地方!

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

具体代码如下:

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,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?【不得不说卡哥预判了我】

其实跳几步无所谓,关键在于可跳的覆盖范围!

不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

这个范围内,别管是怎么跳的,反正一定可以跳过来。

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

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

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

局部最优推出全局最优,找不出反例,试试贪心!

如图:

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

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

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

class Solution {
    public boolean canJump(int[] nums) {
        int cover = 0;
        for(int i = 0;i <= cover;i++){
            //求的是数组下标,所以是:当前下标(i)+当前能跳最远距离(nums[i])
            cover = Math.max(i+nums[i] ,cover);
            if(cover >= nums.length - 1){
                return true;
            }
        }
        return false;
    }
}

45.跳跃游戏 II

思路

本题相对于55.跳跃游戏 (opens new window)还是难了不少。

但思路是相似的,还是要看最大覆盖范围。

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

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

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

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

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

如图:

45.跳跃游戏II

图中覆盖范围的意义在于,只要红色的区域,最多两步一定可以到!(不用管具体怎么跳,反正一定可以跳到)

从图中可以看出来,就是移动下标达到了当前覆盖的最远距离下标时,步数就要加一,来增加覆盖距离。最后的步数就是最少步数。

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

  • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
  • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
class Solution {
    public int jump(int[] nums) {
        if(nums.length <=1){
            return 0;
        }

        int cur = 0;//当前覆盖的距离
        int next = 0;//下次可以覆盖的最大距离
        int step = 0;//步数
        
        for(int i = 0;i<nums.length;i++){
            //在可覆盖区域中记录最大的覆盖区域
            next = Math.max(i+nums[i],next);
            //说明当这一步步,在跳一步就达到了末尾
            if(next >= nums.length -1){
                step++;
                break;
            }
            //走到当前覆盖的最大区域时,更新下一步可以达到的最大区域
            if(i==cur){
                cur = next;
                step++;
            }
        }
        return step;
    }
}

贪心算法没有什么规律好烦啊,做不出来。做题目的时候都没什么思路,然后就只能看卡哥的视频。但是还是没能完全理解,二刷我要全部学会~!!!

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

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

相关文章

LoongArch 指令集实验exp6

在借鉴了友佬的代码后&#xff0c;终于是跑通了测试。 1. 2. 4. 5. 6. 还需要改一个&#xff08;&#xff09; assign sr64_result {{32{op_sra & alu_src1[31]}}, alu_src1[31:0]} >> alu_src2[4:0]; //rj >> i5

Panoply启动报错A Java Exception has occurred

Panoply启动报错A Java Exception has occurred 问题描述 原因 可能是版本不对&#xff0c;目前panoly只支持java11以后的了&#xff0c;我的java是8的&#xff0c;需要升级。 解决方案 删除原有的Java8重新安装Java11之后&#xff0c;即打开成功 安装Java11步骤

抓取网页的含义和URL基本构成

抓取网页是指通过爬虫程序从互联网上获取网页的内容和数据。抓取网页是爬虫的核心功能之一&#xff0c;通过抓取网页&#xff0c;可以获取到网页中的文本、图片、链接等信息&#xff0c;用于后续的数据分析、挖掘和应用。 URL&#xff08;Uniform Resource Locator&#xff09…

了解并使用 jetty

前言 Jetty 是 Eclipse 基金会下的一个开源项目&#xff0c;它是一款用Java实现的、基于标准的HTTP服务器和JAVA Servlet容器。其优秀的性能和强大的可配置性使其在构建复杂和大规模的应用程序中非常受欢迎。在此篇文章中&#xff0c;我们将深入了解 Jetty&#xff0c;以及它如…

移远通信5G RedCap模组拿下首个中国移动5G物联网开放实验室5G及轻量化产品能力认证

10月21日&#xff0c;在2023世界物联网博览会期间&#xff0c;中国移动举办了以“智融万物 创见未来”为主题的物联网开发者大会暨物联网产业论坛。作为中国移动在物联网领域重要的合作伙伴&#xff0c;移远通信应邀参加论坛。 随着千行百业数智化进程的不断加速&#xff0c;5G…

【Java】Spring Cloud OAuth2之密码模式实战

Spring Cloud OAuth2 代码地址&#xff1a;https://gitee.com/kkmy/kw-microservices.git (又是一年1024&#xff0c;分享一下之前搭的OAuth2服务) OAuth2依赖版本 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud…

Kubernetes 部署 kubeflow1.6.1

前言 安装前请注意捋清楚版本关系&#xff0c;如kubeflow版本对应的K8S版本及其相关工具版本等等 我们此处使用的是是kubeflow-1.6.1和K8s-v1.22.8 单机部署 部署K8S 初始化Linux 1.关闭selinux setenforce 0 && sed -i "s/SELINUXenforcing/SELINUXdisable…

flutter开发实战-hero动画简单实现

flutter开发实战-hero动画简单实现 使用Flutter的Hero widget创建hero动画。 将hero从一个路由飞到另一个路由。 将hero 的形状从圆形转换为矩形,同时将其从一个路由飞到另一个路由的过程中进行动画处理。 Flutter Hero动画 Hero 指的是可以在路由(页面)之间“飞行”的 widge…

应用在PC机中的低功耗触摸感应芯片

PC机一般指个人计算机。个人计算机是指一种大小、价格和性能适用于个人使用的多用途计算机。台式机、笔记本电脑、小型笔记本电脑、平板电脑以及超级本等都属于个人计算机。计算机的发展主要按照构成计算机的电子元器件来划分&#xff0c;共分为四个阶段&#xff0c;即电子管阶…

作为语雀的深度用户,谈谈语雀崩溃

文章目录 语雀简介语雀不可用接近8小时&#xff0c;我的感受谈谈云端存储的主要缺点其他软件如何解决云端存储的缺点总结 语雀简介 在数字化时代&#xff0c;云端服务扮演着关键的角色&#xff0c;为个人和企业提供了各种在线服务。其中&#xff0c;协作与知识管理工具变得越来…

自考02378《信息资源管理》第一章信息资源管理基础——思维导图

备战2024年04月自考科目02378《信息资源管理》第一章信息资源管理基础 思维导图如下&#xff1a; 以上便是本文的全部内容了&#xff0c;不知道对你有没有帮助呢。 我会认真写好每一篇文章&#xff0c;一直努力下去&#xff01;

从京东API接口,三个数字,带你认识真正的京东工业

京东工业赴港上市&#xff0c;带着非常优秀的成绩。 招股书显示&#xff0c;2022年实现交易额223亿元&#xff0c;营收141亿元&#xff0c;调整后净利润7亿元。短短六年时间&#xff0c;已成为中国工业供应链技术与服务市场领导者。 京东工业与传统工业品贸易商有何不同&#x…

【2021集创赛】Digilent杯二等奖:基于FPGA的动态视觉感知融合的运动目标检测系统

杯赛题目&#xff1a;Diligent杯&#xff1a;基于FPGA开源软核的硬件加速智能平台 参赛组别&#xff1a;A组 设计任务&#xff1a; 利用业界主流软核处理器(仅限于Cortex-M系列及 RISC-V系列)在限定的DIGILENT官方FPGA平台上构建SoC片上系统&#xff0c;在 SoC中添加面向智能应…

猿辅导发布博物馆新知计划,上线文物科普记录片《文物也有AB面》

博物馆里有什么&#xff1f;文物&#xff0c;可能是大多数人脱口而出的答案。博物馆拥有包罗万象的文物&#xff0c;不仅能够传递知识&#xff0c;提供艺术养分&#xff0c;更有助于青少年增强文化自信和文化传承的使命感。一座博物馆就像一所大学校&#xff0c;一个能够普及知…

lwip多网卡自适应选择

当系统中有多个网卡时&#xff0c;lwip会选择第一个网卡作为默认网卡&#xff0c;ping、tftp、iperf都会选择第一个网卡来进行&#xff0c;没有办法使用第二个网卡&#xff08;一些命令可以通过-i选项选择网卡&#xff0c;有些命令则没有提供&#xff09;&#xff0c;此时需要修…

NSS [SWPUCTF 2021 新生赛]PseudoProtocols

NSS [SWPUCTF 2021 新生赛]PseudoProtocols 先看题目&#xff0c;题目要求我们先找到hint.php。 看这个get请求头&#xff0c;我们先用php://filter协议读一波 得到提示&#xff0c;让我们前往/test2222222222222.php 源码如下 <?php ini_set("max_execution_time&qu…

Excel怎么合并单元格?这4个方法很简单!

“有没有朋友知道Excel合并单元格应该怎么操作呀&#xff1f;在制作工作报表中&#xff0c;需要对Excel单元格进行合并操作&#xff0c;但是我不太熟悉详细的操作&#xff0c;希望大家帮帮我&#xff01;” 在Excel中&#xff0c;合并单元格是一项常用的操作&#xff0c;用于改…

【Docker】Dockerfile使用技巧

开启Buildkit BuildKit是Docker官方社区推出的下一代镜像构建神器&#xff0c;可以更加快速&#xff0c;有效&#xff0c;安全地构建docker镜像。 尽管目前BuildKit不是Docker的默认构建工具&#xff0c;但是完全可以考虑将其作为Docker&#xff08;v18.09&#xff09;的首选…

基本的爬虫工作原理

爬虫是一种自动化程序&#xff0c;能够模拟人类的浏览行为&#xff0c;从网络上获取数据。爬虫的工作原理主要包括网页请求、数据解析和数据存储等几个步骤。本文将详细介绍爬虫的基本工作原理&#xff0c;帮助读者更好地理解和应用爬虫技术。 首先&#xff0c;爬虫的第一步是…

CTFHub-SSRF-读取伪协议

WEB攻防-SSRF服务端请求&Gopher伪协议&无回显利用&黑白盒挖掘&业务功能点-CSDN博客 伪协议有&#xff1a; file:/// — 访问本地文件系统 http:/// — 访问 HTTP(s) 网址 ftp:/// — 访问 FTP(s) URLs php:/// — 访问各个输入/输出流(I/O streams) dic…