LeetCode 121买卖股票的最佳时机
300 Words|Read in about 2 Min|本文总阅读量次
leetcode第121题,买卖股票的最佳时机。采用动态规划或者类似双指针来完成。
LeetCode 121买卖股票的最佳时机
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 1:
1输入:[7,1,5,3,6,4]
2输出:5
3解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
4注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
1输入:prices = [7,6,4,3,1]
2输出:0
3解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 104
思路
可以跟之前的136题一样,使用暴力求解,但是不推荐。
这里可以使用动态规划。
这里可以看做把买股票作为一种亏损,买股票作为一种盈利。
1//定义DP数组,其中i代表的是天数,j可以有0,代表不持有股票/或者股票卖出,j可以为1代表目前还持有股票。
2//DP[i][0],代表当前第i天不持有股票/或者股票卖出的总收益
3//DP[i][1],代表当前第i天持有股票的总收益(持有肯定是负的)
4DP[i][j]
5DP[i][0] = Math.max(DP[i - 1][0], DP[i - 1][1] + nums[i]);
6DP[i][1] = Math.max(DP[i - 1][1], -nums[i]);
解题
1class Solution {
2 public int maxProfit(int[] prices) {
3 //判定是否满足要求
4 if(prices.length < 2)
5 {
6 return 0;
7 }
8
9 //用动态规划的方式,并且构造一个二位的DP数组
10 int[][] DP = new int[prices.length][2];
11 //初始化DP数组
12 DP[0][0] = 0;
13 DP[0][1] = -prices[0];//股票持有,那么就是负数
14 //从第二天开始遍历
15 for(int i = 1; i < prices.length; i++)
16 {
17 DP[i][0] = Math.max(DP[i - 1][0], DP[i - 1][1] + prices[i]);
18 DP[i][1] = Math.max(DP[i - 1][1], -prices[i]);
19 }
20 return DP[prices.length - 1][0];
21 }
22}
开始遍历数组来形成DP
当然,买卖股票其实就是找到一个低位点,然后看低位点的某一高点的距离,距离最大即为最佳买卖点。
解题优化
1class Solution {
2 public int maxProfit(int[] prices) {
3 //判定是否满足要求
4 if(prices.length < 2)
5 {
6 return 0;
7 }
8 //类似双指针,使用遍历数组,指针A作为最小值,指针B用于和指针A保持最大距离
9 int min = prices[0];
10 int max = 0;
11 for(int i = 1; i < prices.length; i++)
12 {
13 if(min > prices[i])
14 {
15 min = prices[i];
16 }else
17 {
18 max = Math.max(max, prices[i] - min);
19 }
20 }
21 return max;
22 }
23}