目录
一、需求
A:给定一个数组,它的第i个元素是一支给定股票第i天的价格;
B:你最多只允许完成一笔交易(买入和卖出一支股票),设计算法计算能获取的最大利润;
C:注意你不能在买入股票前卖出股票;
二、递归法
2.1 思路分析
2.2 代码实现
class Solution {
public int maxProfit(int[] prices) {
int len = prices.length;
int money = profit(prices,len);
return money;
}
//定义功能
public int profit(int[] prices, int len) {
int money = 0;
if(len == 0) {
return 0;
}
//递归结束条件
if(len == 1) {
return 0;
}
money = profit(prices,len-1);
//计算len-1次
for(int i = 0; i < len-1; i++) {
money = Math.max(prices[len-1] - prices[i],money);
}
return money;
}
}
2.3 复杂度分析
A:时间复杂度为O(n);
B:空间复杂度为O(n);
三、暴力法
3.1 思路分析
A:假设有3天,从第1天就买入,然后求第2天就卖出的利润,第3天卖出的利润,
这0和这两者的最大值;
B:然后从第2天买入,求第3天卖出的利润,然后求A和这个的最大值;
C:第3天买入,第3天卖出,就是0,不用考虑了;
3.2 代码实现
public int maxProfit(int[] prices) {
int money = 0;
//确定有多少天
int day = prices.length;
for(int i = 0; i < day; i++) {
for(int j = i+1; j < day; j++) {
money = Math.max(prices[j] - prices[i],money);
}
}
return money;
}
3.3 复杂度分析
A:时间复杂度为O(n^2);
B:空间复杂度为O(1);
四、对暴力法的改进
4.1 思路分析
4.2 代码实现
public int maxProfit(int prices[]) {
int minprice = Integer.MAX_VALUE;
int maxprofit = 0;
for (int i = 0; i < prices.length; i++) {
if (prices[i] < minprice)
minprice = prices[i];
else if (prices[i] - minprice > maxprofit)
maxprofit = prices[i] - minprice;
}
return maxprofit;
}
4.3 复杂度分析
A:时间复杂度为O(n);
B:空间复杂度为O(1);