(LeetCode-数组-1) 买卖股票的最佳时机[通俗易懂]

(LeetCode-数组-1) 买卖股票的最佳时机

大家好,又见面了,我是全栈君。

1.买卖股票的最佳时机

假设你有一个数组,其中第 i 个元素是一支给定股票第 i 天的价格。如果您只能完成最多一笔交易(即买入和卖出一股股票),则设计一个算法来找到最大的利润。

输入: [7, 1, 5, 3, 6, 4]
输出: 5

最大利润 = 6-1 = 5(不是 7-1 = 6, 因为卖出价格需要大于买入价格)

分析:
1.只能交易一笔
2.变量current为买入价格,max为最大利润
3.低则买入,高则卖出

int maxProfit(vector<int>& prices) {
        if(prices.empty())return 0;
        int max=0,current=prices[0];
        for(int i=1;i<prices.size();i++){
        if(current>prices[i]){
            current=prices[i];
        }else{
            int sum=prices[i]-current;
            if(sum>max)max=sum;
        }
        }
        return max;
}

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

假设有一个数组,它的第 i 个元素是一个给定的股票在第 i 天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

分析:
1.可以交易多笔
2.相邻价格中,只要后一次比前一次高,就买入

int maxProfit(vector<int>& prices) {
     if(prices.empty())return 0;
       int max = 0;
       for(int i=1; i<prices.size(); i++) {
         if(prices[i] - prices[i-1] > 0) {
              max += (prices[i] - prices[i-1]);
         }
     }
     return max;
}

3.买卖股票的最佳时机 III

假设你有一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。你不可同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

分析:
1.最多可以进行两笔交易
2.将数组分为左右两个子数组,分别求出对应的最大利润

int maxProfit(vector<int>& prices) {
            if(prices.empty())return 0;
            int min=prices.front(),max=prices.back(),size=prices.size();
            vector<int> left(size,0);
            vector<int> right(size,0);
            for(int i=1;i<size;i++){
            if(prices[i]>min){
                left[i]=(prices[i]-min)>left[i-1]?(prices[i]-min):left[i-1];
            }else{
                left[i]=left[i-1];
                min=prices[i];
            }
    }
    for(int i=size-2;i>=0;i--){
        if(prices[i]<max){
            right[i]=(max-prices[i])>right[i+1]?(max-prices[i]):right[i+1];
        }else{
            right[i]=right[i+1];
            max=prices[i];
        }
    }
    int result=0;
    for(int i=0;i<size;i++){
        result=(right[i]+left[i])>result?(right[i]+left[i]):result;
    }
    return result;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107604.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国产操作系统(Linux)技术流派[通俗易懂]

    国产操作系统(Linux)技术流派[通俗易懂]图1Linux发行版如上图所示目前主流的Linux发行版大体可以分为两类:一类是简称为RPM系,另一类是简称为DEB系。基中RPM系是以Redhat为代表,其主导发行的包括:服务器商业版:RedhatEnterpriseLinux服务器社区版:Centos社区版:FedoraCentos以它是来自于RedhatEnterpriseLinux依照开放源代码规定释出的源代码所编译而成。Fedora则是RedhatEnterpriseLinux是…

    2022年5月16日
    52
  • 汇编学习 安装DOSBOX及debug.exe教程

    相信有很多小伙伴跟我一样,在学习汇编时却发现win764位系统下是无法使用debug.exe的,因为win7x64没有debug.exe这个文件,因此需要安装DOSBOX。需要下载地址的可到我的资源中查找。下面开始安装教程:1.下载后解压并安装DOSBOX,最好安装在c盘以外的盘,下面以安装在d盘为例2.将MASM文件夹移到d盘根目录下3.打开DOSBOX,这时会出现两个窗

    2022年4月12日
    82
  • ov7740摄像头_雷威视监控摄像头二码是无

    ov7740摄像头_雷威视监控摄像头二码是无近日入手了一块正点原子家的OV7725摄像头模块,秉着小白尽可能学得透彻些的想法,选择了野火家的相同摄像头教学视频。链接如下:【单片机】野火STM32F103教学视频(配套霸道/指南者/MINI)【全】(刘火良老师出品)(无字幕)_哔哩哔哩_bilibili现对PPT和火哥所授内容进行整理:在各类传感器获取信息中,图像包含有最丰富的信息。但是摄像头模块仅用于获取输出图像,像利用摄像头进行人脸识别,图像识别之类功能,主要是依赖于识别算法,这是另外的技术。分类:摄像头按输出信号分类可分为模拟

    2022年9月23日
    4
  • datagrip2022安装教程与激活【2021最新】

    (datagrip2022安装教程与激活)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~0H…

    2022年3月31日
    512
  • img图片加载失败?

    img图片加载失败?问题场景在工作中经常会使用标签进行图片展示,但是经常有图片加载失败的情况发生(图片地址不存在、图片已经删除等)。场景再现图片加载失败时的用户体验是很不好的。虽然标签有alt属性可以展示文本,但是用户体验依然差。代码:&amp;amp;amp;amp;amp;amp;lt;imgalt=&amp;amp;amp;amp;amp;quot;头像&amp;amp;amp;amp;amp;quot;src=&amp;amp;amp;amp;amp;quot;$

    2022年6月2日
    52
  • zookeeper入门教程_ZooKeeper的事件机制原理

    zookeeper入门教程_ZooKeeper的事件机制原理zookeeperwatcher架构zookeeper 配置中心分布式ID分布式锁集群搭建数据一致性协议:zab协议Zookeeper Leader选举Observer角色及其配置watcher架构客户端首先将Watcher注册到服务器,同时将Watch对象保存到客户端的Watch管理器中。当Zookeeper服务器监听到的数据发生变化时,服务器会通知客户端,接着客户端的Watch管理器会触发相关的Watcher来回调响应处理逻辑,从而完成整体的数据发布/订阅流程。javaAPIJava

    2022年8月9日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号