思路
具体会导致全局最优,这里就可以使用贪心算法。方式如下:
遍历每一位元素找出当前元素最佳卖出是收益是多少。然后依次获取最大值,就是全局最大值。
这里可以做一个辅助数组:右侧最大数组,求右侧最大数组就要从右往左求。
比如[7,1,5,3,6,4],从4开始,没有右侧,取-1,
到6,右侧最大是4,到3,右侧最大是6,依次类推。代码如下:
class Solution {
// 主方法用于计算最大利润
public static int maxProfit(int[] prices) {
// 如果输入数组为 null 或长度为 0,直接返回利润为 0
if (prices == null || prices.length == 0) {
return 0;
}
// 调用 getRightMax 方法来获取每个元素右侧的最大值的数组
int[] rightMax = getRightMax(prices);
int max = 0; // 用于存储和更新最大利润
// 遍历价格数组
for (int i = 0; i < prices.length; i++) {
// 计算当前价格i和其右侧最大价格之差,更新 max 到最大利润
max = Math.max(max, rightMax[i] - prices[i]);
}
// 返回计算得到的最大利润
return max;
}
// 辅助方法,用于生成每个位置右侧的最大价格数组
private static int[] getRightMax(int[] prices) {
int N = prices.length; // 数组长度
int[] maxArray = new int[N]; // 存储从右至左的最大值
int max = prices[N-1]; // 从最右侧开始,初始化最大值为数组最后一个元素
// 从右向左遍历数组
for (int i = N - 2; i >= 0; i--) {
maxArray[i] = max; // 存储当前的最大值
// 如果当前元素大于已知的最大值,更新 max
if (prices[i] > max) {
max = prices[i];
}
}
// 因为最右侧元素右边没有元素,所以这里设置为 -1 表示无效值
maxArray[N-1] = -1;
// 返回构建的最大值数组
return maxArray;
}
}