给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例
:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
提示
:
1 <= prices.length <= 105
0 <= prices[i] <= 104
思路:股票价格是波动的,需要拿到一天的价格跟其前面所有价格做对比得出最大利润;还需要通过对比拿到最小股价,这天就是最好的买入价格
总结:利用动态规划思想解决问题,原理就是当前价跟前面的价格对比 倒推出最优方案的过程
方案一
class Solution {
/**
思路:
股票价格是波动的,需要拿到当天价格跟前面的所有价格做对比得出最大利润
最大利润必要条件就是买入价格越小越好,最小的那个就是买入的价格
然后在价格最大时卖出
总结:利用动态规划思想解决问题,原理就是当前价跟前面的价格对比 倒推出最优方案的过程
*/
public int maxProfit(int[] prices) {
//0.边界判断
if(prices==null||prices.length==0) return 0;
//1.定义求解需要的数据结构
int minPrice = prices[0];//最小买入价
int maxProfit = 0;//最大获利
//2.通过扫描一遍数组得出最大利润
for(int i = 0; i < prices.length;i++) {
if(prices[i]<minPrice) {
//当前价格比最小价还小,更新最小价
minPrice = prices[i];
}else {//大于最小价可以获利
//对比这次获利 跟 最大获利那个大
maxProfit = Math.max(prices[i]-minPrice,maxProfit);
}
}
//3.返回结果
return maxProfit;
}
}
方案二
:动态规划 即求最大连续子序列和 ,因为第i天买,第j天卖的利润就是第i~j天内 所有相邻两天股票的差之和
网友评论