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