LeetCode——best-time-to-buy-and-sell-stock i-ii-iii
Posted Shaw_喆宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——best-time-to-buy-and-sell-stock i-ii-iii相关的知识,希望对你有一定的参考价值。
Q:假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
如果你最多只能完成一笔交易(即买一股和卖一股股票),设计一个算法来求最大利润。
A:当前值比最小值小,代替最小值;当前值比最小值大,计算差值,和之前的差值做判断。
public int maxProfit(int[] prices) {
if (prices.length == 0)
return 0;
int sum = 0;
int min = prices[0];
for (int i = 1; i < prices.length; i++) {
if (min < prices[i])
sum = Math.max(sum, prices[i] - min);
else if (min > prices[i])
min = prices[i];
}
return sum;
}
Q:假设你有一个数组,其中第i个元素表示某只股票在第i天的价格。
设计一个算法来寻找最大的利润。你可以完成任意数量的交易(例如,多次购买和出售股票的一股)。但是,你不能同时进行多个交易(即,你必须在再次购买之前卖出之前买的股票)。
A:所有的涨坡的最高点减最低点
public static int maxProfit(int[] prices) {
if (prices.length <= 1)
return 0;
int min = prices[0];
int sum = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] < min)
min = prices[i];
if (prices[i] > min && (i == prices.length - 1 || prices[i] >= prices[i + 1])) {
sum += (prices[i] - min);
min = prices[i];
}
}
return sum;
}
Q:假设你有一个数组,其中第i个元素是某只股票在第i天的价格。
设计一个算法来求最大的利润。你最多可以进行两次交易。
注意:
你不能同时进行多个交易(即,你必须在再次购买之前出售之前买的股票)。
A:结合一下前两个代码,在每个峰值计算一次前后两个子数组的最大利润,相加比较。
public static int maxProfit(int[] prices) {
if (prices.length <= 1)
return 0;
int min = prices[0];
int sum = 0;
for (int i = 1; i < prices.length; i++) {
if (prices[i] < min)
min = prices[i];
//找到峰值的时候
if (prices[i] > min && (i == prices.length - 1 || prices[i] >= prices[i + 1])) {
int left = max(Arrays.copyOfRange(prices, 0, i + 1));
int right = 0;
if (i != prices.length - 1) {
right = max(Arrays.copyOfRange(prices, i + 1, prices.length));
}
sum = Math.max(sum, (left + right));
min = prices[i];
}
}
return sum;
}
public static int max(int[] prices) {
if (prices.length == 0)
return 0;
int sum = 0;
int min = prices[0];
for (int i = 1; i < prices.length; i++) {
if (min < prices[i])
sum = Math.max(sum, prices[i] - min);
else if (min > prices[i])
min = prices[i];
}
return sum;
}
以上是关于LeetCode——best-time-to-buy-and-sell-stock i-ii-iii的主要内容,如果未能解决你的问题,请参考以下文章