给定一个数组prices,prices[i]为一支股票第i天的价格,设计一个算法来计算能获取的最大收益,可以尽可能完成多的交易,但是不能同时参与多笔交易(必须在再次购买
第一次思考该问题 我认为需要先遍历数组,选出股调价格最低的一天,同时购入股票,然后再次遍历数组,选出在最低的一天之后最高的一天,并在这一天卖出股票,然后之后再在其余的天书中选取最小的一天,再在最高的一天卖出去,依次循环,直到最后一天跳出循环。
并第一时间写出了代码,代码如下
class Solution {
public int maxProfit(int[] prices) {
int day=0,money=0,sum=0;
while(day!=prices.length-1){
for(int j = day+1; j < prices.length; j++){ //遍历数组
if(prices[j] < prices[day]) //找到数组中的最小值
day = j;
}
money = money -prices[day]; //记录购入的股票价格
for(int j = day+1; j < prices.length; j++){ //遍历数组
if(prices[j]>prices[day]){
day = j;
}
}money = money + prices[day];//卖出股票同时记录价格
}
if(money < 0) return 0 ;
return money;
}
}
第一次测试有以下几点错误:
1.最低的一天购入最高的一天卖出,其收益不一定为最大值。
2.算法耗费时间过长,导致超时。
3.结果并不正确
然后重新分析结果,上一次的代码中没有考虑可以多次出售股票,由于可以多次出售,可能最大值减去最小值并不能使利益最大化,在此我们加入可多次出售的因素,将数据画作坐标图,
通过坐标图,我们可以很直观的看出,若想获取最大利益只要把所有的上升部分加起来,因此出现了新的思路:只要后一天比前一天价格高就出售,然后依次加和,得出的结果必定为最大值。
代码如下:
class Solution {
public int maxProfit(int[] prices) {
int money = 0,t = 0;//t用于数组遍历 ans用于储存结果
for(int i = 1;i < prices.length; i++){
if(prices[i]>prices[i-1]){//如果在后一天卖掉能赚钱那就买掉
t = prices[i]-prices[i-1];
money = money + t;
}
}
return money;
}
}
经查阅各位大佬的解法,此解法叫做贪心算法,将每一个问题分解成一个个小问题,在每一个小问题中求局部的最优解,最后加和可得出接近整体的最优解,但是只能用于求最大值或者最小值。
还有一种解法是动态规划,目前没有能力做出,在以后的笔记中会提及到。