力扣188(注意:本题与主站 121 题相同:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)
动态规划思路:https://leetcode.cn/problems/gu-piao-de-zui-da-li-run-lcof/solutions/192221/mian-shi-ti-63-gu-piao-de-zui-da-li-run-dong-tai-2/
class Solution {
public int bestTiming(int[] prices) {
int cost = Integer.MAX_VALUE, profit = 0;
for(int price : prices) {
cost = Math.min(cost, price);
profit = Math.max(profit, price - cost);
}
return profit;
}
}
方法1
class Solution {
public int bestTiming(int[] prices) {
int size = prices.length;
if (size < 2) {
return 0;
}
int[] dp = new int[size]; // dp[i]第i天操作可以获取的最大利润
dp[0] = 0;
dp[1] = prices[1] - prices[0];
int max = Math.max(dp[0], dp[1]);
for (int i = 2; i < size; ++i) {
int diff = prices[i] - prices[i - 1];
dp[i] = Math.max(diff + dp[i - 1], diff); // 卖 与 不卖 取较大值
max = Math.max(max, dp[i]);
}
return max;
}
}
方法2
找最小最大点,好方法!
// 版本1
class Solution {
public int bestTiming(int[] prices) {
if (prices.length < 2) {
return 0;
}
int res = 0, minVal = prices[0];
for (int i = 1; i < prices.length; ++i) {
minVal = prices[i - 1] < minVal ? prices[i - 1] : minVal;
res = res > prices[i] - minVal ? res : prices[i] - minVal;
}
return res;
}
}
// 版本2
class Solution {
public int bestTiming(int[] prices) {
int min = Integer.MAX_VALUE;
int max = 0;
for(int i = 0;i<prices.length;i++){
min = Math.min(prices[i],min);
max = Math.max(max,prices[i]-min);
}
return max;
}
}