给定一个数组,它的第i个元素是一支给定股票第i天的价格。
如果你最多只允许完成一次交易,(即买入和卖出一支股票一次),设计一个算法来计算你所能获得的最大利润。
注意:你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
解决方案
我们需要找出给定数组中两个数字之间的最大差值(即最大利润),此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)
形式上,对于每组 i 和 j (其中 j > i) 我们需要找出 max(prices[j] - prices[i]);
方法一: 暴力法
/** * @param {number[]} prices * @return {number} */// 第一种解法,使用两个变量 i 和 j 他们分别表示买进这支股票和卖出这支股票的价格// 枚举它们在价格数组上可能出现的所有位置,算出价格差varmaxProfit=function(prices){letlen=prices.length;if(len<2){return0;}// 有可能不做交易,所以初始值为0letres=0;for(leti=0;i<len-1;i++){for(letj=i+1;j<len;j++){res=Math.max(res,prices[j]-prices[i]);}}returnres;};复杂度分析
- 时间复杂度:O(N^2) 这里N是股价数组的长度
- 空间复杂度:O(1)。
方法二:
这种方法只需要遍历一次数组,用一个变量记录遍历过程中的最小值,然后每次计算当前值和最小值之间的差为利润,然后每次选择较大的利润来更新,当遍历完成之后利润就是我们想要求得的结果。
/** * @param {number[]} prices * @return {number} */varmaxProfit=function(prices){letres=0;letbuy=Number.MAX_VALUE;// 表示最大值for(letpriceofprices){buy=Math.min(buy,price);res=Math.max(res,price-buy);}returnres;};
给定一个数组,它的第i个元素是一支给定股票第i天的价格。
如果你最多只允许完成一次交易,(即买入和卖出一支股票一次),设计一个算法来计算你所能获得的最大利润。
注意:你不能在买入股票前卖出股票。
示例 1:
示例 2:
解决方案
我们需要找出给定数组中两个数字之间的最大差值(即最大利润),此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)
形式上,对于每组 i 和 j (其中 j > i) 我们需要找出 max(prices[j] - prices[i]);
方法一: 暴力法
复杂度分析
方法二:
这种方法只需要遍历一次数组,用一个变量记录遍历过程中的最小值,然后每次计算当前值和最小值之间的差为利润,然后每次选择较大的利润来更新,当遍历完成之后利润就是我们想要求得的结果。