1. 题目
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
121. 买卖股票的最佳时机
2. 解法
2.1 解法一:动态规划
2.2 解法二:非动态规划
思路
这道题的目标是给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格,找出只进行一次交易(即买入和卖出一支股票)所能获得的最大利润。动态规划的思路是维护一个最小买入价格和一个最大利润,遍历数组,更新这两个变量,最后返回最大利润
代码的逻辑
代码的逻辑是这样的:
- 首先,判断数组的长度是否小于等于1,如果是,就直接返回0,因为没有交易的可能。
- 然后,初始化一个变量min,表示最小买入价格,初始值为数组的第一个元素。初始化一个变量ans,表示最大利润,初始值为0。
- 接着,从数组的第二个元素开始遍历,对于每个元素prices[i],做两件事:
- 用prices[i]减去min,得到当前卖出价格和最小买入价格的差值,即当前利润。如果这个利润大于ans,就更新ans为这个利润。
- 用min和prices[i]比较,如果prices[i]小于min,就更新min为prices[i],表示找到了更低的买入价格。
- 最后,遍历结束后,返回ans作为答案。
这样,我们就可以在一次遍历中找到最大利润。
具体实现
public int maxProfit(int[] prices) { int length = prices.length; int min = prices[0]; int max = 0; for (int i = 1; i < length; i++) { if (prices[i] > min) { max = Math.max(max, prices[i] - min); } else { min = prices[i]; } } return max; }
3. 总结