—l2021-12-05l—
1014. 最佳观光组合
题目描述
给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的 距离 为 j - i。
一对景点(i < j)组成的观光组合的得分为 values[i] + values[j] + i - j ,也就是景点的评分之和 减去 它们两者之间的距离。
返回一对观光景点能取得的最高分。
思路
将问题 values[i] + values[j] + i - j 分解为 values[i] + i 和 values[j] - j 即可
题解
- 由于题目时间要求,所以需要对原本多重循环进行优化到O(n)
- for循环中的顺序用于满足 j > i 这一条件
class Solution {
public:
int maxScoreSightseeingPair(vector<int>& values) {
int maxN=0;
int n=values[0]+0;
for(int i=1;i<values.size();i++){
//以下顺序用于保证j>i
maxN=max(maxN,values[i]-i+n);
n=max(n,values[i]+i);
}
return maxN;
}
};
121. 买卖股票的最佳时机
题目描述
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
思路
第 i 天的最大利润 = max(之前最大利润,当天利润 - 之前某天最小利润)
题解
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxS=0,minS=prices[0];
for(int i=0;i<prices.size();i++){
if(prices[i]-minS>0) maxS=max(maxS,prices[i]-minS);
minS=min(minS,prices[i]);
}
return maxS;
}
};
122. 买卖股票的最佳时机 II
题目描述
给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
思路
以动态规划思想:
求第 i 天卖出时的最大利润 = max ( 前天获取的最大利润 + ( 如果今天的钱 - 昨天的钱小于零 就是"零",如果不是就是“今天的钱 - 昨天的钱” ), prices[i]-minN>0?prices[i]-minN:0 )
题解
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==1) return 0;
int m=max(0,prices[1]-prices[0]),n=max(0,prices[1]-prices[0]),
maxN=max(prices[1]-prices[0],0),minN=min(prices[0],prices[1]);
for(int i=2;i<prices.size();i++){
m=max(m+(prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0),
prices[i]-minN>0?prices[i]-minN:0);
minN=min(minN,prices[i]);
maxN=max(m,n);
}
return maxN;
}
};