买卖股票的最佳时机

16 篇文章 0 订阅
2 篇文章 0 订阅

买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。
示例1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0

题解

一个简单的思路for双重循环 但会测试超时

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

想一想怎样才能减少检索的次数呢,于是想到,先找出vector里面最小的元素,这一天就是当天买进的日子,再从这以后的日期搜索会不会有最大的大于他的数字出现,如果有,两者之差就是最大利润,否则就没有最大利润,返回0

int max_p=0,min_p=10000,k;
    int maxProfit(vector<int>& prices) {
        for(int i=0;i<prices.size();i++){
            if(prices[i]<min_p){
                min_p=prices[i];
                k=i;
            }
        }
        for(int j=k+1;j<prices.size();j++){
            max_p=max(prices[j]-prices[k],max_p);
        }
        return max_p;
    }

但实际上这个思路不正确,从以下测试数据中体现出来错误点在哪里

输入:
[2,4,1]
输出
0
预期结果
2

也就是说min_price中记录的不应该是一整个vector中的最小值,而是当下搜索阶段中的最小值,因为在下一个最小值出现以前,当下最小值就有可能会产生一个不等于0的最大利润

正解

int maxProfit(vector<int>& prices) {
        int inf = 1e9;
        int min_p = inf, max_p = 0;
        for (int price: prices) {
            max_p = max(max_p, price - min_p);
            min_p = min(price, min_p);
        }
        return max_p;
    }

可是利用一维动态规划的方式效率并不高,后面有时间再看看其他题解学习一下。 买卖股票的最佳时机

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值