第121题:买卖股票的最佳时机

一. 问题描述

给定一个数组,它的第 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。

二. 解题思路

本体思路:采用动态规划的算法进行求解。找到状态转移函数。N为第n行到最后一行的最大值,i为某一行第i个数。其中Max(n)代表前n天利润最大差,g(n)表示第n天的股票价格,f(n)代表前n天股票最低价格值。

Max(n)=Max(Max(n-1),g(n)-f(n-1))

步骤一:根据状态转移方程,我们可以从第一天进行算起,与最低股票价格进行判断,得到利润值,如果利润值大于temp,则temp等于最大利润值,否则接着往后进行判断,直到遍历结束。

三. 执行结果

执行用时 :1 ms, 在所有 java 提交中击败了99.97%的用户

内存消耗 :37.1 MB, 在所有 java 提交中击败了85.51%的用户

四. Java代码

class Solution {
    public int maxProfit(int[] prices) {
         if(prices.length==0||prices==null){
             return 0;
         }
        int min=prices[0];
        int max=prices[0];
        int temp=0;
        for(int i=0;i<prices.length;i++) {
            if(prices[i]<min) {
                min=prices[i];
                max=prices[i];
            }else if(prices[i]>max) {
                max=prices[i];
                temp=Math.max(temp, max-min);
            }
        }
        return temp;
    }
}
原文地址:https://www.cnblogs.com/xiaobaidashu/p/11887791.html