学习算法笔记(7.5)-贪心算法(股票售卖问题)

news2024/11/18 13:52:25

学到这里的大家应该都非常清楚贪心算法到底是怎么一回事了,说白了就是动态规划的一种特例,没有动态规划的使用范围广,但是效率却比动态规划效率高,贪心算法不考虑之前的情况,只考虑当前的最优选择以期达到最优的结果。

目录

##买卖股票售卖的最佳时机

 ##买卖股票的最佳时机Ⅱ


##买卖股票售卖的最佳时机

121. 买卖股票的最佳时机 - 力扣(LeetCode)

可以将整个问题进行简化说明,就是在某一天买了一支股票在这天之后的某天将这支股票再给卖出,以期获得最大的利润。

##代码示例+思路

只需要确定最小的左边界和更新右边界减去当前最小的左边界

//c++代码示例
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        //不存在利润的情况
        if (prices.size() < 2)
        {
            return 0 ;
        }
        //存在利润的情况
        //最小的利润为0
        int ans = 0 ;
        //将第一支股票设为当前的最小值
        int mins = prices[0] ;
        for (int i = 1 ; i < prices.size() ; i++)
        {
            //更新答案
            ans = max(ans,prices[i] - mins) ;
            //更新最小值,我们所说的左边界
            mins = min(mins,prices[i]) ;
        }
        return ans ;
    }
};
#python代码示例
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        #借助一个列表,不断往后更新答案,增加了额外开销
        if len(prices) < 2 :
            return 0 
        dp = [0] * (len(prices))
        mins = prices[0]
        for i in range(1,len(prices)) :
            dp[i] = max(dp[i-1],prices[i] - mins)
            mins = min(mins,prices[i])
        return dp[-1]

 ##买卖股票的最佳时机Ⅱ

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

可以在某一天买入或者卖出,同一天的买入和卖出可以不用考虑因为始终为0。

可以在某一天买入然后再后某一天再卖出(次数不限),以期获得最大利润。

##代码示例+思路

如果是一个递增的股票序列[1,3,5,6],我们现在思考什么时候会有最大利润呢,本天的情况我们不需要考虑,只需要考虑当天及之后的天数对利润的影响,3 - 1 + 5 - 3 + 6 - 5 = 6 - 1 ;

因此我们得到一个结论,只要后一支股票比当前支股票大,直接卖出即可。

//c++代码示例
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if (prices.size() < 2 )
        {
            return 0 ;
        }
        int ans = 0 ;

        for (int i = 1 ; i < prices.size() ; i++)
        {
            if (prices[i] > prices[i - 1])
            {
                ans += prices[i] - prices[i - 1] ;
            }
        }
        return ans ;

    }
};

当然我们也可以采用动态规划来解决当前这个问题,因为贪心仅仅是动态规划的一种特例。

动态规划我们又该怎么考虑该问题呢?

我们可以考虑是否持有股票的状态来进行此类问题的解决-我们通常称为简单的状态dp。

#python代码示例
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        @cache
        def dfs(i , hold) :
            if i < 0 :
                return -inf if hold else 0
            if hold :
                return max(dfs(i-1,True),dfs(i-1,False)-prices[i])
            else :
                return max(dfs(i-1,False),dfs(i-1,True) + prices[i])
        return dfs(n-1,False)
#python代码示例
class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        n = len(prices)
        f = [[0] * 2 for _ in range(n+1)]
        f[0][1] = -inf
        for i , p in enumerate(prices) :
            f[i+1][0] = max(f[i][0],f[i][1] + p)
            f[i+1][1] = max(f[i][1],f[i][0] - p)
        return f[n][0]
//c++代码示例
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size(),f[n+1][2] ;
        memset(f,0,sizeof(f)) ;
        f[0][1] = INT_MIN ;
        for (int i = 0 ; i < n ; i++)
        {
            f[i+1][0] = max(f[i][0],f[i][1] + prices[i]) ;
            f[i+1][1] = max(f[i][1],f[i][0] - prices[i]) ;

        }
        return f[n][0] ;
    }
};
//c++代码示例
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size() , memo[n][2] ;
        memset(memo,-1,sizeof(memo)) ;

        function<int(int,bool)> dfs = [&](int i , bool hold)->int
        {
            if (i < 0)
            {
                return hold ? INT_MIN : 0 ;
            }
            int &res = memo[i][hold] ;
            if (res != -1)
            {
                return res ;
            }
            if (hold)
            {
                return res = max(dfs(i-1,true),dfs(i-1,false)-prices[i]) ;
            }
            else
            {
                return res = max(dfs(i-1,false),dfs(i-1,true) + prices[i]) ;
            }

        };
        return dfs(n-1,false) ;
    }
};

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

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

相关文章

通过血清拉曼光谱进行COVID-19的高效初步筛查

通过血清拉曼光谱进行COVID-19的高效初步筛查 原创 小王搬运工 时序课堂 2024-06-04 20:04 四川 论文地址&#xff1a;https://analyticalsciencejournals.onlinelibrary.wiley.com/doi/full/10.1002/jrs.6080 论文源码&#xff1a;无 期刊&#xff1a;JOURNAL OF RAMAN SPE…

数据挖掘实战-基于Catboost算法的艾滋病数据可视化与建模分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Qt 简易Word

Ui界面如下&#xff1a; 查找和替换界面&#xff1a; 具体代码&#xff1a; GitHub : 简易Word Gitee : 简易Word

package.json中resolutions的使用场景

文章目录 用途配置示例使用方法注意事项和peerDependencies有什么不同peerDependenciesresolutions 总结 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的…

九大微服务监控工具详解

Prometheus Prometheus 是一个开源的系统监控、和报警工具包&#xff0c;Prometheus 被设计用来监控“微服务架构”。 主要解决&#xff1a; 监控和告警&#xff1a;Prometheus 可以对系统、和应用程序进行实时监控&#xff0c;并在出现问题时发送告警&#xff1b;数据收集和…

构建体育直播平台源码:深度解析数据分析模块的核心展示内容

在现代的体育直播平台中&#xff0c;数据分析展示已经成为不可或缺的一部分。如下参考借助“东莞梦幻网络科技”提供的体育直播源码&#xff0c;打造的平台&#xff0c;并通过表格形式为用户列出以下数据分析内容&#xff1a; 1、积分排名&#xff1a;反映了各支队伍在赛季中的…

【全开源】JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码

&#xff1a;构建便捷出行新体验 一、引言&#xff1a;探索打车系统小程序源码的重要性 在数字化快速发展的今天&#xff0c;打车系统小程序已成为我们日常生活中不可或缺的一部分。它以其便捷、高效的特点&#xff0c;极大地改变了我们的出行方式。而背后的关键&#xff0c;…

Android14 WMS-窗口绘制之relayoutWindow流程(一)-Client端

Android14 WMS-窗口添加流程(一)-Client端-CSDN博客 Android14 WMS-窗口添加流程(二)-Server端-CSDN博客 经过上述两个流程后&#xff0c;窗口的信息都已经传入了WMS端。 1. ViewRootImpl#setView 在窗口添加流程(一)中&#xff0c;有这个方法&#xff1a; http://aospxref…

Ubuntu22.04 下 pybind11 搭建,示例

Pybind11 是一个轻量级的库&#xff0c;用于在 C 中创建 Python 绑定。Ubuntu22下安装pybind11步骤如下&#xff1a; 1. 安装 pybind11 1.1 pip 命令安装 pip3 install pybind11 1.2 源代码安装 安装依赖库&#xff1a; sudo pip install -i https://pypi.tuna.tsinghua.e…

要想数据形成好的数据集,必须数据治理(目的之一是防止大模型产生灰色数据等),用于炼丹(训练数据私有化模型)的数据才是好数据

数据治理&#xff1a;必要性、实施方法及挑战 引言 在当今数字化时代&#xff0c;数据已经成为企业最重要的资产之一。随着数据量的爆炸性增长&#xff0c;如何有效地管理和利用数据成为企业面临的重大挑战。数据治理&#xff08;Data Governance&#xff09;作为一种系统化的…

排序数组 ---- 分治-归并

题目链接 题目: 分析: 用这道题来回顾一下归并排序的思想找到中间结点, 将数组分成两半, 运用递归的思想, 继续对一半进行分半, 分到最后剩一个元素, 再将左右数组合并, 合并两个有序数组, 是先分解, 再合并的过程在合并两个有序数组时, 需要一个额外的数组来记录, 为了避免每…

【RabbitMQ基础】-RabbitMQ:初识MQ[1]

简介 RabbitMQ &#xff08;高性能的异步通讯组件&#xff09; RabbitMQ是一个开源的消息队列中间件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准。它是一种可靠、可扩展、灵活和可插拔的解决方案&#xff0c;用于处理异步消息传递和事件驱动系统。…

HDFS的块汇报和块放置策略--从一次HDFS写文件故障开始(WIP)

文章目录 前言事故分析&#xff1a;代码解析BlockReport的调度和时机哪些Block会进行FBR或者IBRIBR所选定的BlockFBR所选定的Block 块放置策略详解之在上层寻找机器为文件添加块的基本流程块放置策略&#xff1a;选择机器为每个副本逐个寻找机器在指定范围内随机寻找简单看一下…

毕业论文word常见问题

0、前言&#xff1a; 这里的问题都是以office办公软件当中的word为例&#xff0c;和WPS没有关系。 1、页眉横线删不掉&#xff1a; 解决方案&#xff1a;进入页眉编辑状态&#xff0c;在开始选项栏中选择页眉字体样式&#xff0c;清除格式。 修改方式如下&#xff1a; 2、…

FL Studio21.8中文版深受欢迎的数字音频工作站(DAW)

在数字音乐制作领域&#xff0c;FL Studio21中文版作为一款深受欢迎的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;因其强大的功能、用户友好的界面和对中文用户的优化支持而备受推崇。它广泛应用于音乐创作、编曲、录音、混音以及母带处理等领域&#xff0c;尤其适…

Serverless 使用OOS将http文件转存到对象存储

目录 背景介绍 系统运维管理OOS 文件转存场景 前提条件 实践步骤 附录 示例模板 背景介绍 系统运维管理OOS 系统运维管理OOS&#xff08;CloudOps Orchestration Service&#xff09;提供了一个高度灵活和强大的解决方案&#xff0c;通过精巧地编排阿里云提供的OpenAPI…

nodejs---fs模块,文件读写操作详解,自定义一个文件写入方法

fs模块导入 Node.js 同时支持 CommonJS 和 ES 模块系统&#xff08;自 Node.js v12 以来&#xff09; // 两种模块导入方式 import * as fs from fs;// Es6:这种方式需要在package.json中配置"type": "module" const fs require(fs);// commonJs:如果你…

【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)

目录 一、 进程1.1 PID(进程标识符)1.2 内存指针1.3 文件描述符表1.4 状态1.5 优先级1.6 记账信息1.7 上下文 二、线程三、总结&#xff1a;进程和线程之间的区别&#xff08;非常非常非常重要&#xff0c;面试必考题&#xff09; 一、 进程 简单来介绍一下什么是进程&#xf…

【人工智能】流行且重要的智能算法整理

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 小记&#xff1a; 今天在看之前写的文档时&#xff0c;发现有人工智能十大算法的内容&#xf…

stdlib.h: No such file or directory

Qt报错: error: stdlib.h: No such file or directory #include_next &#xff1c;stdl 报错&#xff0c; 其他博主的解决方法&#xff1a; Qt报错: error: stdlib.h: No such file or directory #include_next &#xff1c;stdl_qt5.15 无法打开包括文件“stdlib.h” no suc…