买入卖出股票的最佳时间(分不同的交易次数)

两次交易版

题目描述

假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
设计一个算法来求最大的利润。你最多可以进行两次交易。
注意:
你不能同时进行多个交易(即,你必须在再次购买之前出售之前买的股票)。

分析
一只股在i天的时间内可以进行至多两次交易,买入-卖出-买入-卖出,目标是 最终利润=max{ -第一次买入价格+第一次卖出价格 - 第二次买入价格 + 第二次卖出价格}。因为刚学到贪心法,所以第一时间就想能不能用贪心法解决问题:如果在这i天时间里分开两部分,这前后两部分刚好存在最佳的买入点(即价格最低)和最佳的卖出点(价格最高),那么就能获得最高利润。但如果这中间不存在最佳的买入点,例如股价一直在涨,那么也不需要频繁交易,持股待涨就好。
假设变量buy1为第一次买入点,sell1为第一次卖出点,buy2和sell2分别为第二次交易。只需遍历一次,就可以找到最佳结果。

代码

public class Solution {
    public int maxProfit(int[] prices) {
        //第一次、第二次、第三次、第四次操作资金剩余
        int buy1=Integer.MIN_VALUE,sell1=0,buy2=Integer.MIN_VALUE,sell2=0; 
        for(int i=0;i<prices.length;i++){
            //第一次操作,找到最低价
            buy1 = Math.max(buy1, -prices[i]);
            //卖出,利润最大值
            sell1 = Math.max(sell1, buy1+prices[i]);
            //第一次资金剩余减去第二次买入价格
            buy2 = Math.max(buy2, sell1-prices[i]);
            //最终剩余
            sell2 = Math.max(sell2, buy2+prices[i]);
        }
        return sell2;
    }
}
不限交易版

题目描述

假设你有一个数组,其中第i个元素表示某只股票在第i天的价格。
设计一个算法来寻找最大的利润。你可以完成任意数量的交易(例如,多次购买和出售股票的一股)。但是,你不能同时进行多个交易(即,你必须在再次购买之前卖出之前买的股票)。

分析
脑海里浮现出股票k线图…不限交易那就买买买,涨的都有份,跌的时候手里没份额,就能实现最高收益

代码

public class Solution {
    public int maxProfit(int[] prices) {
        //不限次数的交易,最大利润就是每次买入都是涨价的,所有涨的都有份,跌的时候早就卖了
        int max=0;
        for(int i=1;i<prices.length;i++){
            if(prices[i]>prices[i-1])
                max += prices[i]-prices[i-1];
        }
        return max;
    }
}
最多交易一次

题目描述

假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
如果你最多只能完成一笔交易(即买一股和卖一股股票),设计一个算法来求最大利润。

分析
一开始错误的思路:想找到最低点和最高点,如果最低点时间比最高点时间要靠后,那就不买。测试用例2,4,1说明了它的错误——前面明明可以买入也有收益,这个思路却偏偏要找到最大最小值才操作。
正确的做法和最多交易两次的一样。

public class Solution {
    public int maxProfit(int[] prices) {
        if(prices.length<2)return 0;
        int buy=Integer.MIN_VALUE,sell = 0;
        for(int i=0;i<prices.length;i++){
            buy = Math.max(buy, -prices[i]);
            sell = Math.max(sell, buy+prices[i]);
        }
        return sell;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值