写题解仅为自我回顾
理论内容:
目录
1:买卖股票的最佳时机
思路解析:
本题有三种方法,逐一介绍
1:暴力解法
遍历两次数组,两个for循环,用每次遍历让result=max(result,prices[j]-prices[i])来记录并更新
代码实现:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
for(int i=0;i<prices.size();i++)
{
for(int j=i+1;j<prices.size();j++)
{
result=max(result,prices[j]-prices[i]);
}
}
return result;
}
};
2:贪心算法
要使利润最大,那么就要保证我选择买的股票价格是最便宜的,我选择卖出的股票在那天是最贵的,并且买股票必须在卖股票之前;遍历一遍数组
用min取寻找最小的价格的股票:low=min(low,prices[i]);
用max取寻找最大的利润:result=max(result,prices[i]-low);
代码实现:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0;
int low=INT_MAX;
for(int i=0;i<prices.size();i++)
{
low=min(low,prices[i]);
result=max(result,prices[i]-low);
}
return result;
}
};
3:动态规划
(1)设想:假设刚开始没有钱,手头的钱为0,那么dp根据列坐标可根据题意分为两类
···1:dp[i][0]持有股票时的所得的最多钱
持有股票相当于:我可能是今天买的,也可能是前几天买的,此时我持有股票
递推公式:dp[i][0]=max(dp[i-1][0],-prices[i])
解释:此时我持有股票,我啥都不干,我的钱没有损失,等于上一个的结果;
此时我想要买下这个股票,那么我的现金就要从0变成-prices[i]:当日股票的价格负数
···2:dp[i][1]不持有股票时所得的最多钱
不持有股票相当于:我可能是今天卖的,也可能是前几天卖的,此时我没有股票
递推公式:dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])
解释:此时我不持有股票,我啥都不敢,我的钱没有损失,等于上一个的结果;
此时我想卖掉这个股票&#x