问题介绍
Say you have an array for which the ith element is the price of a
given stock on day i. If you were only permitted to complete at most
one transaction (ie, buy one and sell one share of the stock), design
an algorithm to find the maximum profit.
抽象出来就是找到一个数组nums[0,n]
的子数组 nums[i, j] (0 <=i < j <= n)
使得 nums[j] - nums[i]
取得最大值。当然可以直接使用暴力解法,复杂度为O(n*n)
。但是有一个更为聪明的办法,可以将复杂度降解为O(n)
, 这就是非常有名的卡丹尔算法。求解思路很简洁,本质是动态规划的思想,只需要维护一个dp数组,记录子数组结束于当前位置i
时的最大值, 因为一定要包含位置i
, 故有dp[i] = dp[i - 1] + nums[i] - nums[i - 1]
。根据题意有dp[i]的最小值是0,因此 dp[i] = max(0, dp[i - 1] + nums[i] - nums[i - 1])
,遍历dp数组找到一个最大值即可。可以进一步进行优化,在扫描nums数组的时候使用max_ending_here
表示dp[i]
, 使用max_so_far
维护max_ending_here
所有出现的值中的最大值,从而将空间复杂度从O(n)
降解为O(1)
求解
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int * newIntRaw(int n)
{
<