day6
程序员文章站
2022-07-13 22:30:05
...
- c++
作者:iswJXkYVv3
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size() == 0) return 0;
int st = prices[0];
vector<int> ans;
ans.push_back(0);
// 正向贪心,结果存储在 ans 中,注意此时范围是 1 ~ (size() - 2),计算的是 prices[now] - buy,st 是当前最优买入价
for(int i = 1; i < prices.size() - 1; i ++)
{
ans.push_back(max(prices[i] - st, ans[i - 1]));
st = min(prices[i], st);
}
st = prices[prices.size() - 1];
int outp = ans[prices.size() - 1];
// 反向贪心,结果存储在 ans 中,注意此时范围是 (size() - 2) ~ 1,计算的是 sell - prices[now],st 是当前最优卖出价
for(int i = prices.size() - 2; i > 0; i --)
{
outp = max(outp, st - prices[i] + ans[i]);
st = max(prices[i], st);
}
return outp;
}
};
- python
作者:fei-ben-de-cai-zhu-UC4q0zhusJ
class Solution(object):
# 本题可采用二分法计算
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
candidate = []
# 记录出售股票所获得的最大收益
max_profit = 0
if len(prices) <= 1:
return max_profit
for index in range(len(prices)):
left = self.single_profit(prices[:index])
right = self.single_profit(prices[index:])
max_profit = max(max_profit, left+right)
return max_profit
# 获取一段区间内完成一笔交易的最大利润
def single_profit(self, prices):
# 定义获取的最大利润
max_profit = 0
if len(prices) <= 1:
return max_profit
# 分别定义股票的最小价格以及最高价格
min_price = prices[0]
max_price = 0
for price in prices:
max_price = max(max_price, price-min_price)
min_price = min(min_price, price)
return max_price
if __name__ == "__main__":
prices = [3,3,5,0,0,3,1,4]
max_profit = Solution().maxProfit(prices)
print(max_profit)
简单二分法
既然限制次数是两次,那我就可以使用二分法将prices区间分为两段,分别求左右两段区间内一次股票交易获得的最大利润即可。有些读者可能会疑惑:题目限制次数为两次,那么也可能是一次,即只需要一次股票交易就能获得最大利润
只需要一次遍历,不停的划分左右区间就可以求解每次遍历得到的最大值,最后取所有值的最大值即可。
作者:fei-ben-de-cai-zhu-UC4q0zhusJ
上一篇: day6
下一篇: Unity Shader·屏幕破碎效果