算法记录 | Day32 贪心算法

news2025/1/12 12:21:49

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

贪心算法

思路:

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

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

如图:

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

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

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

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

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        res =  0
        for i in range(1,len(prices)):
            res += max(0,prices[i]-prices[i-1])
        return res

动态规划

  1. 状态定义

状态表示:
状态方程 = { d p [ i ] [ 0 ] = 表示第 i 天交易完后,手上没有股票时的最大利润, d p [ i ] [ 1 ] = 表示第 i 天交易完后,手上持有股票时的最大利润。 状态方程 = \begin{cases} dp[i][0] =表示第 i 天交易完后,手上 没有 股票时的最大利润,\\ dp[i][1] =表示第 i 天交易完后,手上 持有 股票时的最大利润。 \end{cases} 状态方程={dp[i][0]=表示第i天交易完后,手上没有股票时的最大利润,dp[i][1]=表示第i天交易完后,手上持有股票时的最大利润。

  1. 状态转移

状态转移方程为:

{ d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] + p r i c e s [ i ] ) d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 0 ] − p r i c e s [ i ] ) \begin{cases} dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]) \\ dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]) \end{cases} {dp[i][0]=max(dp[i1][0],dp[i1][1]+prices[i])dp[i][1]=max(dp[i1][1],dp[i1][0]prices[i])

  1. 初始化

对第一天(i=0)的状态进行初始化:

dp[0] [0]: 第一天手上无股票,也没有购入股票。

dp[0] [1]: 第一天手上持有股票说明在当天购入了股票,花费 prices[0]prices[0]prices[0],即所获利润为 −prices[0]-prices[0]−prices[0]。

  1. 执行结果

遍历全部的日期i,则最后一天手上没有股票时的状态值dp[n-1] [0]即为我们能够获得的最大利润。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        # dp[i][0]:第i天结束后,手上没有股票的最大利润(第i天卖出股票 )
        # dp[i][1]:第i天结束后,手术持有股票的最大利润(第i天买入股票)
        dp = [[0]*2  for _ in range(n)]

        # 初始化
        dp[0][0] = 0
        dp[0][1] = -prices[0]

        for i in range(1,n):
            # dp[i][0]:max(前一天没有股票,前一天持有股票+当天卖出)
            dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]) 
            # dp[i][1]:max(前一天持有股票,前一天没有股票+当天买入)
            dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i])
        return max(dp[n-1][0],dp[n-1][1])
        # return dp[n - 1][0]

55.跳跃游戏

思路:

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

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

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

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

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

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

具体步骤:

  1. 初始化能到达的最远位置max_i为 0。
  2. 遍历数组 nums。
  3. 如果能到达当前位置,即 max_i<i,并且当前位置 + 当前位置最大跳跃长度 > 能到达的最远位置,即 i + nums[i] > max_i,则更新max_i。
  4. 遍历完数组,最后比较能到达的最远位置 max_i和数组最远距离 size - 1 的关系
class Solution:
    def canJump(self, nums: List[int]) -> bool:
        size = len(nums)
        max_i = 0
        for i in range(size-1):
            if max_i >=i and i + nums[i] > max_i:
                max_i = i + nums[i]
        return max_i >= size -1 

45.跳跃游戏II

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

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

思路:

  1. 当前所能达到的最远位置 end,下一步所能跳到的最远位置 max_pos,最少跳跃次数 setps
  2. 遍历数组 nums 的前 len(nums) - 1个元素:
  3. 每次更新第 i位置下一步所能跳到的最远位置 max_pos
  4. 如果索引 i到达了 end 边界,则:更新 end为新的当前位置 max_pos,并令步数steps+1
  5. 最终返回跳跃次数 steps。
class Solution:
    def jump(self, nums: List[int]) -> int:
        end = 0
        max_pos = 0
        step = 0
        for i in range(len(nums)-1):
            max_pos  =  max(i + nums[i],max_pos)
            if i == end:
                end = max_pos
                step += 1
        return  step

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

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

相关文章

PyCharm+PyQt5+pyinstaller打包labelImg.exe

0 开头 labelImg是一款标注软件&#xff0c;作为一个开源项目&#xff0c;它的源码可以在github上找到。官方仓库地址为&#xff1a; https://github.com/heartexlabs/labelImg 小白安装时的最新版本编译出来的界面长这样&#xff1a; 之前在小白的博客里&#xff0c;也教过…

Spring学习5

一、代理模式 代理模式就是AOP的底层&#xff01; 1.代理模式的分类 静态代理动态代理2.静态代理 角色分析&#xff1a; 抽象角色&#xff1a;一般使用接口或者抽象类来解决真实角色&#xff1a;被代理的角色代理角色&#xff1a;代理真实角色后&#xff0c;一般会做一些附属操…

走进小程序【七】微信小程序【常见问题总结】

文章目录&#x1f31f;前言&#x1f31f;小程序登录&#x1f31f;unionid 和 openid&#x1f31f;关键Api&#x1f31f;登录流程设计&#x1f31f;利用现有登录体系&#x1f31f;利用OpenId 创建用户体系&#x1f31f;利用 Unionid 创建用户体系&#x1f31f;授权获取用户信息流…

JVM内存模型详解

JVM内存模型和Java内存模型都是面试的热点问题&#xff0c;名字看感觉都差不多&#xff0c;实际上他们之间差别还是挺大的。 通俗点说&#xff0c;JVM内存结构是与JVM的内部存储结构相关&#xff0c;而Java内存模型是与多线程编程相关mikechen。 什么是JVM JVM是Java Virtual …

【教学类-30-04】10以内减法题不重复(一页两份)(包括6以内、7以内、8以内、9以内、10以内减法题 只抽取25个)

作品展示 ——10以内不重复减法题 需求&#xff1a; 1、制作10以内减法题 材料准备&#xff1a; Word模板 代码展示&#xff1a; 6、7、8、9、10以内减法一页两份&#xff08;10以内减法一页两份&#xff08;6以内、7以内、8以内、9以内、10以内不重复减法题&#xff09; 时间…

文件访问被拒绝?5个解决方法!

案例&#xff1a;文件访问被拒绝 【朋友们&#xff0c;想问问大家的电脑有遇到过文件访问被拒绝的情况吗&#xff1f;真的太头疼了&#xff0c;大家都是怎么解决的呢&#xff1f;】 在日常使用电脑和操作文件时&#xff0c;有时我们可能会遇到文件访问被拒绝的情况。这可能会…

Scala框架Akka学习

Scala框架Akka 文章目录Scala框架AkkaAkka概述Akka特点Akka与Scala.actors.Actor的关系Akka模型介绍Actor模型的优点Akka模型的核心概念如何创建Actor添加依赖在Akka中&#xff0c;Actor负责通信&#xff0c;在Actor中有一些重要的生命周期方法**akka的架构原理**创建Actor的步…

Charles二次开发-接口解密

1&#xff0c;使用背景 最近工作中对公司接口进行抓包&#xff0c;发现接口路径和返回都是经过加密的&#xff0c;对于查看接口路径及接口返回结果带来了不便&#xff0c;于是想到了对Charles进行小改造&#xff0c;在Charles上增加一个按钮对加密的请求、响应结果解密&#x…

[学习笔记]计算机图形学(一)

计算机图形学学习笔记&#xff08;一&#xff09; 什么是计算机图形学 计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。 什么是好的画面&#xff1f; 从技术层面简单的评判标准&#xff1a;直接看画面…

Android实现RecyclerView分组显示功能完整示例(自定义组头和Item布局)

实现效果截图&#xff1a; 首先&#xff0c;我们需要为RecyclerView添加一个分组的概念&#xff0c;我们可以创建一个Group类来表示分组&#xff0c;包括分组名称和分组中的数据项列表。代码如下&#xff1a; public class Group {private String name;private List<Item&g…

ChatGPT-5到底有多强?Battle!咱貌似也不输呀!

盘点今年的热点话题&#xff0c;ChatGPT是不可避免要被反复提及的一part。从去年的-3.0到今年的-3.5&#xff0c;再到上月刚发布-4.0。从用户体验和市场反馈来讲&#xff0c;这半年的时间&#xff0c;ChatGPT每一步都走得又稳又快&#xff01; 回想起今年2月初ChatGPT全网爆火的…

最短路径-dijkstra/floyd

目录 floyd -dijkstra floyd floyd:用来求所有顶点之间的最短路径问题,求最短路径具体节点顺序&#xff0c;求各点之间最短路径长度 理解floyd&#xff1a; 二维矩阵图&#xff0c;就是不断通过测试新的节点k&#xff0c;看看k节点能不能作为中间节点优化各点之间的最短距离…

SourceMap源码映射详细讲解

SourceMap源码映射详细讲解 前端工程打包后代码会跟项目源码不一致&#xff0c;当代码运行出错时控制台上定位出错代码的位置跟项目源码上不对应。这时候我们很难定位错误代码的位置。SourceMap的用途是可以将转换后的代码映射回源码&#xff0c;如果设置了js文件对应的map资源…

Java每日一练(20230416)

目录 1. 三数之和 &#x1f31f;&#x1f31f; 2. 基本计算器 &#x1f31f;&#x1f31f;&#x1f31f; 3. 通配符匹配 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java…

Android:编译libevent动态库并移植jni中,在Android AVD虚拟机上实现一个http服务器

libevent源码&#xff1a;libevent-2.1.8-stable Android Studio版本&#xff1a;Android Studio Electric Eel | 2022.1.1 Patch 2 AVD虚拟机为x86. https://developer.android.google.cn/studio/run/emulator-networking?hlzh-cn#connecting 大体步骤&#xff1a; 1.在ws…

Vue2_01_data_插值

插值语法 {{name}} data: vue实例的数据对象 data中数据变化时将重新渲染容器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--引入vue,引入之后vue.js 创建了一个全局变…

c语言进阶篇_动态内存管理(数组可以自动扩容?)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:讲解c语言中的动态内存管理知识,涉及malloc函数、call…

微信小程序运行及更新机制

微信小程序运行及更新机制1、微信小程序运行机制1.1 前台和后台1.2 小程序启动&#xff1a;冷启动和热启动1.3 小程序销毁2、微信小程序更新机制2.1 启动时同步更新定期检查发现版本更新用户长时间未使用小程序2.2 启动时异步更新开发者手动触发更新2.3 小程序管理后台的相关设…

软件测试分类详解

一图看清软件测试分类 一、按测试技术分&#xff08;是否查看代码&#xff09; **1. 黑盒测试**&#xff1a;软件功能是否正常使用【功能的测试】 **2. 白盒测试**&#xff1a;代码逻辑是否正确【结构的测试】 **3. 灰盒测试**&#xff1a;介于两者之间的测试&#xff0c;也…

第12章_集合框架

第12章_集合框架 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 一方面&#xff0c;面向对象语言对事物的体现都是以对…