**
第六题:还是杨辉三角
**
和 118 题 一样,依旧是杨辉三角。区别在于之前是输出所有层的数,这道题只需要输出第 k 层的数。
意思是说,我们只用一行vector< int> 就行,不断更新这一个,(1 )->( 1,1) ->(1,2,1)因为根据上一题我们可以知道反正都是根据上一行得到当前行,动态规划对吧。
且注意这题条件有所不同
输入: 3
输出: [1,3,3,1]
这里的rowIndex不是指行数,而是指索引
class Solution {
public:
vector<int> getRow(int rowIndex)
{
vector<int> result;
for(int i=0;i<=rowIndex;i++)
{
result.push_back(1);
for(int j=i-1;j>0;j--)//从后往前,从倒数第二个(i-1)到第二个(1)
{
result[j]+=result[j-1];
}
}
return result;
}
};
高,实在是高
方法二:数学法
0!=1,n!=(n-1)!×n。
Cnk=n!/(k!(n−k)! ) = ((n−k+1)* (n-k) *…(n-2)(n-1)(n))/k!
举例rowIndex=3;很容易理解
class Solution {
public:
vector<int> getRow(int rowIndex)
{
vector<int> ans;
int n=rowIndex;
for(int k=0;k<=n;k++)
{
ans.push_back(Combination(n,k));
}
return ans;
}
int Combination(int n,int k)
{
long result=1;//细
for(int i=1;i<=k;i++)//阶乘,1到k,不久是!k呗
{
result=result*(n-k+i)/i;
}
return (int)result;
}
};
**
第七题:买卖股票的最佳时机
**
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
注意:你不能在买入股票前卖出股票。
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
似乎有点类似之前的最长公共子串,确实这题同样有个解法是动态规划
评论区:
动态规划 前i天的最大收益 = max{前i-1天的最大收益,第i天的价格-前i-1天中的最小价格}
同时随时间更新最小价格
存在只有一天的情况,此时利润为0
DP (dynamic programming)
DP的思路: 利用原问题与子问题的关系,将其变成 大问题的解 = 小问题的解的函数, 从而将问题变成size的扩展即可,当size到达最大后,原问题解决了
暴力法已经见怪不怪了,现在看到什么题目我第一反应都是遍历。。
果然这题也是可以的
class Solution{
public:
int maxProfit(vector<int>& prices)
{
int n=(int )prices.size(),ans=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
ans=max(ans,prices[j]-prices[i]);
}
}