方法一:贪心算法
关键点:
1:因为严格按照时间的先后顺序执行,一定要先买,在卖
2:遍历数组维护两个变量maxProfit最大的利润和minPrice最小价格。
3:如果当前价格小于最小的值minPrice时,更新minPrice的值。
4:当前前价格与最小值minPrice得差值大于maxProfi时,更细maxProfi的值
3:返回maxProfit的值
int maxProfit(int* prices, int pricesSize)
{
//贪心法的原理
//记录最小的 和记录最大的
int maxProfit = 0;
int minPrice =prices[0];
int i;
for(i=0; i< pricesSize; i++)
{
if(minPrice > prices[i])
minPrice = prices[i];
if(prices[i]- minPrice > maxProfit)
maxProfit=prices[i]- minPrice;
}
return maxProfit;
}
方法二:动态规划
关键点:
因为前面的暴力法超时的原因是因为大量的重复计算。
如果dp[i][j]表示第i天数,j表示是否持股票
int maxProfit(int* prices, int pricesSize)
{
//动态规划,dp[i][j]在第i天是否持有股票 j = 1持有 j = 0卖出
int dp[pricesSize][2];
int i;
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(i = 1; i < pricesSize; i++ )
{
//第i天没有股票,有两种情况 昨天没有买 今天保持 昨天买了今天 卖出了
dp[i][0] = fmax(dp[i-1][0],dp[i-1][1] + prices[i]);
//第i天持有股票,有两种情况 昨天没有买 今天保持 昨天没买了 今天买
dp[i][1] = fmax(dp[i-1][1],-prices[i]);
}
//for(i = 0; i < pricesSize; i++ )
// printf("i = %d dp[0]:%d dp[1]:%d\n",i,dp[i][0],dp[i][1]);
return dp[pricesSize-1][0];
}