题目1
题解
v a l u e s [ i ] + i + v a l u e s [ j ] − j values[i]+i+values[j]-j values[i]+i+values[j]−j拆分为values[i]+i和values[j]-j,分别求values[i]+i最大值和整体最大值,只需一次遍历
class Solution {
public int maxScoreSightseeingPair(int[] values) {
int res=0;
int maxi=values[0];
for(int j=1;j<values.length;j++){
res=Math.max(res,maxi+values[j]-j);//values[i]+i+values[j]-j最大值
maxi=Math.max(maxi,values[j]+j);//values[i]+i最大值
}
return res;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)
题目2
题解
121. 买卖股票的最佳时机【简单】的进阶题,原来只能买一次股票,现在可以买多次股票了,计算所有利润总和的最大值
动态规划
- 状态定义: dp[i][0] 表示第 i 天交易完后手里没有股票的最大利润,dp[i][1] 表示第 i 天交易完后手里持有一支股票的最大利润
- 状态转移方程:
- 返回值:dp[n-1][0],即最后一天已经卖完全部股票的最大利润
class Solution {
public int maxProfit(int[] prices) {
int n=prices.length;
int dp[][]=new int[n][2];
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<n;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);//第i天无股票最大利润
dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);//第i天有股票最大利润
}
return dp[n-1][0];
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n),亦可以用滚动数组优化空间为O(1)
贪心算法
贪心算法只能用于计算最大利润,计算的过程并不是实际的交易过程。
class Solution {
public int maxProfit(int[] prices) {
int n=prices.length,res=0;
for(int i=1;i<n;i++){
res+=Math.max(0,prices[i]-prices[i-1]);
}
return res;
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)