买卖股票4题
作者:互联网
121. 买卖股票的最佳时机
步骤
1. 第一个元素默认是最小元素,最大收益默认是0。
2. 从第二个元素开始遍历,如果当前元素与最小元素差超过最大收益,那么更新最大收益;如果当前元素比最小元素还要小,那么更新最小元素。
Go代码
func maxProfit(prices []int) int {
profit := 0
minPrice := prices[0]
for i := 1; i < len(prices); i++ {
if prices[i] - minPrice > profit {
profit = prices[i] - minPrice
} else if prices[i] < minPrice {
minPrice = prices[i]
}
}
return profit
}
Java代码
class Solution {
public int maxProfit(int[] prices) {
int profit = 0;
int minPrice = prices[0];
for (int i = 1; i < prices.length; i++) {
if (prices[i] - minPrice > profit) {
profit = prices[i] - minPrice;
} else if (prices[i] < minPrice) {
minPrice = prices[i];
}
}
return profit;
}
}
122. 买卖股票的最佳时机 II
步骤
多次买卖股票,如果当前值大于前者,那么累加差值。
GO代码
func maxProfit(prices []int) int {
res := 0
for i := 1; i < len(prices); i++ {
if prices[i] > prices[i - 1] {
res += prices[i] - prices[i - 1]
}
}
return res
}
Java代码
class Solution {
public int maxProfit(int[] prices) {
int profit = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] > prices[i - 1]) {
profit += prices[i] - prices[i - 1];
}
}
return profit;
}
}
123. 买卖股票的最佳时机 III
步骤
任意一天结束后,只有无操作、第1次买入、第1次卖出、第2次买入和第2次卖出共5种状态。
第1次买入时股票价格记为buy1,第1次卖出时利润记为sell1,第2次买入时股票价格记为buy2,第2次卖出时累计利润记为sell2。
1. 初始状态,针对第1个股票价格,buy1是prices[0],sell1是0(考虑当天就卖出,利润是0),buy2是prices[0](当天第1次卖出后第2次买入),sell2是0(考虑当天就卖出,利润是0)。
2. 遍历后面的股票价格,如果当前股票价格比buy1更小则更新buy1,如果当前股票价格与buy1的差值比sell1更大则更新sell1,如果当前股票价格扣除sell1(第1次买卖股票所得利润)比buy2更小则更新buy2,如果当前股票价格与buy2的差值比sell2更大则更新sell2。
Java代码
class Solution {
public int maxProfit(int[] prices) {
int buy1 = prices[0];
int sell1 = 0;
int buy2 = prices[0];
int sell2 = 0;
for (int i = 1; i < prices.length; i++) {
buy1 = Math.min(buy1, prices[i]);
sell1 = Math.max(sell1, prices[i] - buy1);
buy2 = Math.min(buy2, prices[i] - sell1);
sell2 = Math.max(sell2, prices[i] - buy2);
}
return sell2;
}
}
188. 买卖股票的最佳时机 IV
步骤
模仿买卖股票的最佳时机 III中只能进行2次交易的做法。
1. 初始化buys和sells。
2. 遍历prices,更新buys和sells。
Java代码
class Solution {
public int maxProfit(int k, int[] prices) {
if (prices.length == 0 || k == 0) {
return 0;
}
int[] buys = new int[k];
int[] sells = new int[k];
for (int i = 0; i < k; i++) {
buys[i] = prices[0];
sells[i] = 0;
}
for (int i = 1; i < prices.length; i++) {
buys[0] = Math.min(buys[0], prices[i]);
sells[0] = Math.max(sells[0], prices[i] - buys[0]);
for (int j = 1; j < k; j++) {
buys[j] = Math.min(buys[j], prices[i] - sells[j - 1]);
sells[j] = Math.max(sells[j], prices[i] - buys[j]);
}
}
return sells[k - 1];
}
}
标签:买卖,int,股票,profit,buys,prices,sells,minPrice 来源: https://www.cnblogs.com/WJQ2017/p/15967640.html