需要最大利润。
如果我只能购买一次并卖出一次,我可以修改哪些以获得最大利润? 意味着如果我在5买入并以150卖出其最大利润。
目前我所做的是在价格低于第二天时买入,如果价格超过第二天则卖出。
显然我们要记住,我们只能在买入后卖出,意味着卖出指数不能在买入指数之前。到目前为止,我所做的是:
package com;
public class Stock {
public static void main(String[] args) {
int[] prices = {20,10,70,80,5,150,67};
int length = prices.length-2;
int buy=0;
int sell=0;
int buyIndex=-1;
int sellIndex=-1;
int i=0;
for (i =0 ; i<=length ;i++ ){
// buy logic start
if(prices[i]<prices[i+1]){
if(i>buyIndex){
buy= prices[i];
buyIndex=i;
System.out.println("buy"+buy);
System.out.println("buyIndex"+buyIndex);
}
} // buy logic finish
// sell logic start
if(buy!=0 && i>buyIndex ){
System.out.println("inside sell logic");
if(prices[i]>prices[i+1]){
sell = prices[i];
sellIndex = i;
System.out.println("sell"+sell);
System.out.println("sellIndex"+sellIndex);
}
} // sell logic end
} // for loop end
} // main end
}
输出
buy10
buyIndex1
buy70
buyIndex2
inside sell logic
sell80
sellIndex3
buy5
buyIndex4
inside sell logic
sell150
sellIndex5
答案 0 :(得分:1)
您可以定义2个辅助阵列:min和max,其中:
i
直观地说,min [i]是在max
之前(或之前)看到的最小数字。
相似,max[0] = array[n-1]
max[i] = max(max[i+1], array[i]) 0 <= i < n-1
:
i
直观地说,max [i]是max[i] - min[i]
之后或之后的最大数字。
现在,一旦您拥有这些数组,i
就是最多可以在i
天购买并且至少在日期i
出售的股票所实现的最大利润。如果遍历所有0 <= i < n
s,这基本上是有效事务的定义。
如果你查看所有{{1}},你会找到最佳解决方案。
(注意,通过记住本地最小值,优化可以消除额外空间的需要,但我从额外的空间解决方案开始,在我看来,它具有更清晰的逻辑)
祝你好运!