前言:
继续我们的愉快算法练习之旅=。=
题目描述:
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解题思路:
上一篇说过,解题之前应当准确的理解题意,我这一次又顺利的没有准确的理解=。=,那么就说一下我的解题思路吧。
我所理解的问题本质是,首先我们需要遍历数组,判断如下几种情况
1、如果还未买入,后一个值小于等于前一个那么买入,那么不是合适的买入时机,继续遍历
2、如果已经买入,后一个值小于等于前一个那么买入,是卖出的时机
3、如果还未买入,后一个值大于前一个那么买入,当前指针作为一个买入日期(这时要注意,需要判断是不是最后一天,是则在明天卖出,否则继续遍历。ps:我当时就漏掉了)
4、如果已经买入,后一个值大于前一个那么买入,那么判断是不是最后一天,是则卖出,否则继续遍历
据此我的代码是:
let currentPrice=null;//当前股价
let nextPrice=null;//明天股价
let buyPrice=null;//买入股价
let salePrice=null;//卖出股价
let sum=0;
for(let i=0;i<nums.length-1;i++){
currentPrice=nums[i];
nextPrice=nums[i+1];
/*如果还没有买入并且明天股价低于或等于今天,那么不买入也不卖出*/
if(currentPrice>=nextPrice&&buyPrice==null){
/*到最后一天仍然没有(再次)买入的时机*/
if(i===nums.length-2){
console.log("行情不好,不买了)")
}
}
/*如果已经买入并且明天股价低于或等于今天,那么卖出*/
else if(currentPrice>=nextPrice&&buyPrice!=null){
/*卖出时机*/
salePrice=currentPrice;
sum+=(salePrice-buyPrice);
buyPrice=null;
}
/*如果没有买入并且明天股价高于今天,那么买入*/
else if(currentPrice<nextPrice&&buyPrice==null){
/*买入*/
buyPrice=currentPrice;
if(i===nums.length-2){
/*卖出时机*/
salePrice=nextPrice;
sum+=(salePrice-buyPrice);
buyPrice=null;
}
}
/*如果已经买入并且明天股价高于今天,那么判断日期(当前指针)*/
else if(currentPrice<nextPrice&&buyPrice!=null){
/*还有升价的机会仍然要在明天卖出的时机,因为后天股市爆炸了(数组到头了)=。=*/
if(i===nums.length-2){
/*卖出时机*/
salePrice=nextPrice;
sum+=(salePrice-buyPrice);
buyPrice=null;
}
}
}
console.log(sum);
注释非常详细,代码就不在详细讲了。
其他思路:
提交答案成功通过后照常去看了其他同学的代码,结果发现代码甚是简洁。代码如下:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let profit = 0;
for (let i = 0; i < prices.length; i++) {
if (prices[i-1]<prices[i]) {
profit =profit+prices[i] - prices[i-1]
}
}
return profit
};
明天比今天高就买入,并在第二天卖出,依次类推即可...
我的错误理解是,认为必须在买入后的最高价卖出,即我的程序结果实际上是使用最少的交易次数获取最多的利润,并且可以输入买入和卖出的实时间(虽然是多余的操作=。=)。
总结:
总结是什么呢,买股票不是要等到最高价再卖出才能获得最高的利润=。=,昨天买了,今天涨了,那么就可以马上卖出了,然后再买入,涨价再卖出,如此反复,积少成多。与等到最高价卖出获得的利润是一样一样的(不嫌麻烦的话)。
再就是准确的理解题意,拿到问题(需求)后,一定要仔细找最优解,很重要=。=!!!