股票的最大利润(剑指offer 63)Java动态规划

人生之路不会是一帆风顺的,我们会遇上顺境,也会遇上逆境,在所有成功路上折磨你的,背后都隐藏着激励你奋发向上的动机,人生没有如果,只有后果与结果,成熟,就是用微笑来面对一切小事。

导读:本篇文章讲解 股票的最大利润(剑指offer 63)Java动态规划,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

一、题目描述

二、思路讲解

三、Java代码实现

四、时空复杂度分析 


一、题目描述

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 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。
 

限制:

0 <= 数组长度 <= 10^5

二、思路讲解

        比较典型的动态规划问题,按照天数增长,计算出第一天到当天的最大利润。

        第一天到当天的最大利润 = max{前一天的最大利润, 今天的价格-历史最低价} 。

        考虑极端情况,如果传入的数组为空,直接返回0。

三、Java代码实现

class Solution {
    public int maxProfit(int[] prices) {

        //考虑数组为空的情况
        if(prices.length == 0){
            return 0;
        }

        int len = prices.length;    //天数
        int dp = 0;                 //记录当前最大利润
        int min = prices[0];        //记录当前最小价格

        //计算出第一天到第i天的最大利润
        for(int i=1; i<len; i++){
            min = Math.min(prices[i], min);
            dp = Math.max((prices[i]-min), dp);
        }
        //返回
        return dp;
    }
}

四、时空复杂度分析 

        时间复杂度:        O(N)         需要遍历一遍prices数组

        空间复杂度:        O(1) 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/125052.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!