携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情
题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示
1 <= prices.length <= 10^50 <= prices[i] <= 10^4
题解
思路
该题说的是在某一天买入一只股票,并选择在未来的某一个不同的日子卖出该股票。也就是说,只能买入一支股票,并在未来的某一天卖出股票(非当天)。那么就需要在某一天以最低点买入股票,在未来的某一天以最高价卖出。
定义一个 dp 数组,其中 dp[i] 表示第 i 天卖出股票的最大利润。由上分析可知:决定 dp[i] 的因素为前 i-1 天的最小买入股票价格,即 dp[i] = max{0, prices[i] - min{prices[0...i-1]}},这里需要注意的是,若前面的买入价格比现在的卖出价格要高,则不买入股票,dp[i] = 0。只需要求出 dp 数组中的最大利润即可。 我们发现,dp[i] 只和前面的股票价格最小值有关,因此可以用一个变量 min 来维护prices[0...i-1] 的最小值,同时 dp 数组中每个变量互不影响,可以用一个变量 dp 来保存最终结果。
代码
public int maxProfit(int[] prices) {
int dp = 0;
int min = Integer.MAX_VALUE;
int n = prices.length;
for (int i = 0; i < n; i++) {
dp = Math.max(dp, prices[i] - min);
min = Math.min(prices[i], min);
}
return dp;
}
结语
业精于勤,荒于嬉;行成于思,毁于随。