0%

股票买卖问题

股票买卖相关算法题

121. 买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0

1
2
3
4
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
// 贪心法
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
}
int left = Integer.MAX_VALUE;
int maxProfile = Integer.MIN_VALUE;
for (int i = 0; i < prices.length; i++) {
// 寻找最小左端点
left = Math.min(left, prices[i]);
// 寻找最大收益(当前价格与最小左端点值的差)
maxProfile = Math.max(prices[i] - left, maxProfile);
}
return maxProfile;
}
// 动态规划法
public int maxProfit2(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
}
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < dp.length; i++) {
// dp[i][0] 代表第i天持有股票,持有股票,收益越大,说明股票价格越低
dp[i][0] = Math.max(dp[i-1][0], -prices[i]);
// dp[i][1] 代表第i天不持有股票,卖出股票,收益越大,说明股票价格越高
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[dp.length-1][1];
}
}

122. 买卖股票的最佳时机 II【技】

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润

1
2
3
4
5
输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
  随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
总利润为 4 + 3 = 7
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0;
for (int i = 1; i < prices.length; i++) {
// 假设prices=[1,3,5], 1-5 与 1-3,3-5 的收益是一样的
int diff = prices[i] - prices[i-1];
if (diff > 0) {
maxProfit += diff;
}
}
return maxProfit;
}
}