题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问卖该股票一次可能获得的最大利润是多少?
例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14},如果我们能在价格为5的时候买入并在16时卖出,则能收获最大的利润11.
一、股票的最大利润(一次卖出)
一个数组代表股票每天的价格,可以选择从某一天买入,然后之后的一天卖出,求能够获得的最大收益。
例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。在价格为5的时候买入并在价格为16时卖出,则能获得最大的利润为11.
思路:
记录当前最小值和最大差值
1.最大利润就是计算后面的数字减去前面的数字得到的一个最大的差值;
2.求总体的最大差值,需要的数据:当前的最小值,当前的最大差值;遍历求解即可。
package jianZhiOffer;
/*
* 面试题63:股票的最大利润
* 题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问卖该股票一次可能
* 获得的最大利润是多少?
* 例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14},如果我们能在价格
* 为5的时候买入并在16时卖出,则能收获最大的利润11.
*/
public class Demo63 {
public static void main(String[] args) {
int[] prices= {9,11,8,5,7,12,16,14};
int result = maxProfit(prices);
System.out.println(result);
}
public static int maxProfit(int[] arr) {
int len = arr.length;
if(len<2)
return 0;
int minPrice = arr[0];
int maxDiff = arr[1]-minPrice;
for(int i=2;i<len;i++) {
if(arr[i-1]<minPrice)
minPrice = arr[i-1];
int curDiff = arr[i]-minPrice;
if(curDiff>maxDiff)
maxDiff = curDiff;
}
return maxDiff;
}
}
三、股票的最大利润(可以对股票进行多次的买入和卖出)
思路:
前一天买入,盈利则第二天卖出
1.如果第二天的价格高于第一天的价格就可以以第二天的价格卖出,则卖出后立即再次买入;
2.如果第二天的价格低于第一天的价格,那么就在第一天结束前就卖出,相当于不盈利。
所以,通过逐个相邻两数进行比较即可,如果后面的大,则记为利润。
public static int maxProfit_m(int[] arr) {
int len = arr.length;
if(len<2)
return 0;
int maxProfit = 0;
for(int i=0;i<len-1;i++) {
//贪心法
int profit = arr[i+1]-arr[i];
if(profit>0)
maxProfit += profit;
}
return maxProfit;
}