题目
数组 prices
记录了某芯片近期的交易价格,其中 prices[i]
表示的 i
天该芯片的价格。你只能选择 某一天 买入芯片,并选择在 未来的某一个不同的日子 卖出该芯片。请设计一个算法计算并返回你从这笔交易中能获取的最大利润。
如果你不能获取任何利润,返回 0。
示例 1:
输入:prices = [3, 6, 2, 9, 8, 5] 输出:7 解释:在第 3 天(芯片价格 = 2)买入,在第 4 天(芯片价格 = 9)卖出,最大利润 = 9 - 2 = 7。
示例 2:
输入:prices = [8, 12, 15, 7, 3, 10] 输出:7 解释:在第 5 天(芯片价格 = 3)买入,在第 6 天(芯片价格 = 10)卖出,最大利润 = 10 - 3 = 7。
提示:
0 <= prices.length <= 10^5
0 <= prices[i] <= 10^4
暴力做法,遍历每一种可能,时间复杂度O(n2)
int bestTiming(int* prices, int pricesSize) {
if(pricesSize==0)return 0;
int re=0;
int k=0;
int min =prices[0];
for(int i=1;i<pricesSize;i++){
min=min<prices[i]?min:prices[i];
k=prices[i]-min;
re=re>k?re:k;
}
return re;
}
动规,每一次交易的利润可以看作当前交易利润和前一次交易利润的最大值,当前交易利润为当前价格和之前最低价格的差,即DP[I]=MAX(DP[I-1], prices[i]-mincost),DP[pricesSize-1]即为所求
int bestTiming(int* prices, int pricesSize) {
if(pricesSize==0)return 0;
int k=0;
int dp[pricesSize];
int min =prices[0];
dp[0]=0;
for(int i=1;i<pricesSize;i++){
min=min<prices[i]?min:prices[i];
k=prices[i]-min;
dp[i]=dp[i-1]>k?dp[i-1]:k;
}
return dp[pricesSize-1];
}
时间复杂度O(n),遍历一次数组,空间复杂度O(n) ,保存结果需要等长数组
空间复杂度优化,可以看出计算当前dp[i]需要dp[i-1]、prices[i]和mincost,所以只需要保存常数级别的变量即可
int bestTiming(int* prices, int pricesSize) {
if(pricesSize==0)return 0;
int re=0;
int k=0;
int min =prices[0];
for(int i=1;i<pricesSize;i++){
min=min<prices[i]?min:prices[i];
k=prices[i]-min;
re=re>k?re:k;
}
return re;
}
时间复杂度O(n),空间复杂度O(1)