题目一:
思路一:动态规划
定义dp[i][0]表示第i+1天交易完之后手里没有股票的最大利润,dp[i][1]表示第i+1天交易完之后手里持有股票的最大利润。
当天交易完之后手里没有股票可能有两种情况,一种是当天没有进行任交易,又因为当天手里没有股票,所以当天没有股票的利润只能取前一天手没有股票的利润。一种是把当天手里的股票给卖了,既然能卖,说明手里是股票的,所以这个时候当天没有股票的利润要取前一天手里有股票的利润加天股票能卖的价格。这两种情况我们取利润最大的即可,所以可以得到dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
当天交易完之后手里持有股票也有两种情况,一种是当天没有任何交易,又因为当天手里持有股票,所以当天手里持有的股票其实前一天就已经持有了。还一种是当天买入了股票,当天能买股票,说明前一天手里肯定是没有股票的,我们取这两者的最大值,所以可以得到dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
int max(int a,int b)
{
return a>b?a:b;
}
int maxProfit(int* prices, int pricesSize)
{
int**dp=(int**)malloc(sizeof(int*)*pricesSize);
dp[0]=(int*)malloc(sizeof(int)*2);
dp[0][0]=0;
dp[0][1]=-1*prices[0];
for(int i=1;i<pricesSize;i++)
{
dp[i]=(int*)malloc(sizeof(int)*2);
//手上没有股票的情况
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
//手上有股票的情况
dp[i][1]=max(dp[i-1][0]-prices[i],dp[i-1][1]);
}
return dp[pricesSize-1][0];
}
思路二:贪心算法
只要后一天的股票比前一天的股票值大,就加上他们的差值。
python实现
class Solution:
def maxProfit(self, prices: List[int]) -> int:
return sum(prices[i+1]-prices[i] for i in range(len(prices)-1) if prices[i+1]>prices[i])
c语言实现
int maxProfit(int* prices, int pricesSize)
{
int total=0;
for(int i=1;i<pricesSize;i++)
{
if(prices[i]>prices[i-1])
{
total+=prices[i]-prices[i-1];
}
}
return total;
}
思路三:分治法
题目二:
int allnine(int*arr,int len)
{
for(int i=0;i<len;i++)
{
if(arr[i]!=9)
{
return -1;
}
}
return 1;
}
int* plusOne(int* digits, int digitsSize, int* returnSize)
{
int res=allnine(digits,digitsSize);
if(res==-1)
{
*returnSize=digitsSize;
for(int i=digitsSize-1;i>=0;i--)
{
if(digits[i]!=9)
{
digits[i]++;
return digits;
}
else
{
digits[i]=0;
}
}
}
if(res==1)
{
*returnSize=digitsSize+1;
int*digits=(int*)realloc(digits,sizeof(int)*(digitsSize+1));
digits[0]=1;
for(int j=1;j<digitsSize+1;j++)
{
digits[j]=0;
}
return digits;
}
return digits;
}