会超时的暴力法:
假设在第 i 天 买入 ,记录在第 i+1 天,一直到交易日结束时,卖出的价格,选出最高价。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans = 0;
int n = prices.size();
for(int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
ans = max(ans, prices[j] - prices[i]);
}
}
return ans;
}
};
这里 N 是股价数组的长度
一次遍历:
假设在第 i 天 卖出 股票,记录第 i 天以前股票市场的最低价,假设在最低价时买入。即知道第 i 天卖出的最大利润是多少
c++
class Solution {
public:
int maxProfit(vector<int>& prices) {
int minprice = prices[0]; // c++ 定义正无穷 1e9 = 10^9
int maxProfit = 0;
for (auto price : prices){ // c++ 遍历 vector 元素
maxProfit = max(price - minprice, maxProfit);
minprice = min(minprice, price);
}
return maxProfit;
}
};
python
class Solution:
def maxProfit(self, prices: List[int]) -> int:
minprice = prices[0]
maxProfit = 0
for i in prices:
maxProfit = max(maxProfit, i-minprice) # 减去当日之前的最低价
minprice = min(i, minprice)
return maxProfit
动态规划:
动态规划的精髓:每一步只需要判断:选 or 不选。
c++
dp[i]=max(dp[i−1],prices[i]−minprice) // dp[i] 表示前 i 天的最大利润
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if(n==0){
return 0;
}
int minprice = prices[0]; // 从第一个开始遍历
vector<int> dp(n,0); // 初始化利润vector,长度为5,初始值均为0
for(int i=1; i<n; i++){ // 假设在第1天之后卖出
minprice = min(minprice, prices[i]); // 记录遍历过的最低买入价
dp[i] = max(dp[i-1], prices[i] - minprice);
}
return dp[n-1]; // dp[i] 记录当前时刻卖出,最大利润
}
};
python
class Solution:
def maxProfit(self, prices: List[int]) -> int:
n = len(prices)
if n==0:
return 0
dp = [0 for _ in range(n)] # 创建利润列表
minprice = prices[0] # 初始化当天以前最低价
for i in range(1,n):
dp[i] = max(dp[i-1], prices[i]-minprice)
minprice = min(minprice, prices[i])
return dp[n-1]