难度:eassy
题目描述
示例
暴力肯定会超时,想都别想了
解法1:一遍过
int maxProfit(int* prices, int pricesSize) {
int min=prices[0], max=0;
int i;
for(i=0; i < pricesSize; i ++){
if(prices[i] < min){
min = prices[i];
}else{
if((prices[i]-min) > max)
max=prices[i]-min;
}
}
return max;
}
时间复杂度:
解法2:动态规划
dp[i][0]:表示第0~i天内买股票最便宜价格
dp[i][1]:表示第0~i天内卖出股票能获得的最大利润
dp数组记录的均是一段时间内状态的最值
int maxProfit(int* prices, int pricesSize) {
// 动态规划写法
int dp[pricesSize][2];
int i, j;
// dp[i][0] 表示第0~i天内买股票最便宜价格
// dp[i][1] 表示第0~i天内卖出股票能获得的最大利润
dp[0][0] = prices[0];
dp[0][1] = 0;
for(i = 1; i < pricesSize; i ++){
// dp[i][0] 先算到第i天为止,能买的最便宜的股票
dp[i][0] = dp[i-1][0];
if(prices[i] < dp[i-1][0]) dp[i][0] = prices[i];
// dp[i][1] 计算到第i天位置,能卖出的最大利润
// prices[i]-dp[i-1][0]表示今天把股票买了能获得的最大利润
// dp[i-1][1] 表示之前能获得的最大利润
dp[i][1] = dp[i-1][1];
if(prices[i]-dp[i-1][0] > dp[i-1][1]) dp[i][1] = prices[i]-dp[i][0];
}
return dp[pricesSize-1][1];
}
时间复杂度: