一. 问题描述
给定一个数组,它的第 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; } }