动态规划练习(1)-买卖股票的最好时机
买卖股票的最好时机
https://www.nowcoder.com/practice/64b4262d4e6d4f6181cd45446a5821ec?tpId=117&tqId=37717&rp=1&ru=%2Fta%2Fjob-code-high&qru=%2Fta%2Fjob-code-high%2Fquestion-ranking&tab=answerKey
题目描述
假设你有一个数组,其中第\ i i 个元素是股票在第\ i i 天的价格。
你有一次买入和卖出的机会。(只有买入了股票以后才能卖出)。请你设计一个算法来计算可以获得的最大收益。
示例1
输入
[1,4,2]
返回值
3
思路
- 这种有点像双指针的问题,使用以下dp模板:一维数组,i往右遍历,j从i开始向左遍历。
- code1中状态转移方程为dp[i] = Math.max(dp[i-1],prices[i]-prices[j])。然而是错误的,测试后只过了一半左右。经过调试后发现,在j循环中,计算的前一个dp[i]会被覆盖,因此在code2中又加了一个max函数。当然code3中不用数组也就不存在该问题。
- 该问题也可以不用dp做,这里是为了练习dp。
code1(有误)
import java.util.*;
public class Solution {
public int maxProfit (int[] prices) {
if(prices==null || prices.length==0)return 0;
int n = prices.length;
int[] dp = new int[n];
int max=0;
for(int i=1;i<n;i++)
for(int j=i-1;j>=0;j--)
dp[i] = Math.max(dp[i-1],prices[i]-prices[j]);
System.out.println(Arrays.toString(dp));
return dp[n-1];
}
}code2(ac)
import java.util.*;
public class Solution {
public int maxProfit (int[] prices) {
if(prices==null || prices.length==0)return 0;
int n = prices.length;
int[] dp = new int[n];
int max=0;
for(int i=1;i<n;i++){
for(int j=i-1;j>=0;j--)
dp[i] = Math.max(dp[i],Math.max(dp[i-1],prices[i]-prices[j])); // different
System.out.println(Arrays.toString(dp));
return dp[n-1];
}
}code3(ac)
import java.util.*;
public class Solution {
public int maxProfit (int[] prices) {
if(prices==null || prices.length==0)return 0;
int n = prices.length;
int dp = 0;
int max=0;
for(int i=1;i<n;i++)
for(int j=i-1;j>=0;j--)
dp = Math.max(dp,prices[i]-prices[j]); // different
return dp;
}
}
小天才公司福利 1225人发布

查看7道真题和解析