Java 动态规划Leetcode 第7天
1014. 最佳观光组合
给你一个正整数数组 values
,其中 values[i]
表示第 i
个观光景点的评分,并且两个景点 i
和 j
之间的 距离 为 j - i
。
一对景点(i < j
)组成的观光组合的得分为 values[i] + values[j] + i - j
,也就是景点的评分之和 减去 它们两者之间的距离。
返回一对观光景点能取得的最高分。
思路
动态规划来做。原式可以划为values[i]+i和values[j]-j,则我们可以划为两部分的最大值。这样的话,随着遍历数组,我们对两部分和取最大值,并且若当前的值—下标对之和比之前更大,我们就更新left部分的值即可。
class Solution {
public int maxScoreSightseeingPair(int[] values) {
int max=Integer.MIN_VALUE;
int left=values[0]+0;
for(int i=1;i<values.length;i++){
max=Math.max(max,left+values[i]-i);
left=Math.max(left,values[i]+i);
}
return max;
}
}
121. 买卖股票的最佳时机
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
思路
思路同上
class Solution {
public int maxProfit(int[] prices) {
int max=0;
int left=prices[0];
for(int i=1;i<prices.length;i++){
max=Math.max(max,prices[i]-left);
left=Math.min(left,prices[i]);
}
return max;
}
}
122. 买卖股票的最佳时机 II
难度简单1302
给定一个数组 prices
,其中 prices[i]
是一支给定股票第 i
天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
dp[i]0]表示第i天没有持有股票时的最高效益,dp[i]1]=表示第i天持有股票时的最高效益
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);
class Solution {
public int maxProfit(int[] prices) {
int[][] dp=new int[prices.length][2];
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.length;i++){
dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=Math.max(dp[i-1][0]-prices[i],dp[i-1][1]);
}
return dp[prices.length-1][0];
}
}