1.题目描述 面试题63. 股票的最大利润
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
1 2 3 4 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
1 2 3 输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
限制:
2.代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 package swu.xl.algorithm.code_04_07.experiment_5; public class Solution { /** * leetcode 面试题63. 股票的最大利润 * @param prices * @return */ public static int maxProfit(int[] prices) { //除开特殊情况 if (prices.length == 0 || prices.length == 1){ return 0; } //将每天的资金数据转化为当天和前一天的数据差->最大子串和问题 int[] changes = new int[prices.length-1]; for (int i = 0; i < changes.length; i++) { changes[i] = prices[i+1]-prices[i]; } //存储 最大收益 购买时间 卖出时间的变量 int maxSum = changes[0]; //累计收益 int currentMaxSum = changes[0]; //遍历每一个位置 for (int currentIndex = 1; currentIndex < changes.length; currentIndex++){ //如果累计收益不是正的 if (currentMaxSum <= 0) { //重新计算收益 currentMaxSum = changes[currentIndex]; }else { //收益累加 currentMaxSum += changes[currentIndex]; } //如果累计收益大于最大收益 if (currentMaxSum > maxSum){ //重新计算最大收益 maxSum = currentMaxSum; } } //交易没有完成 if (maxSum < 0){ maxSum = 0; } return maxSum; } /** * 测试程序 * @param args */ public static void main(String[] args) { int[] num1 = {7,1,5,3,6,4}; System.out.println(maxProfit(num1)); int[] num2 = {7,5,4,3,2,1}; System.out.println(maxProfit(num2)); } }
代码思路: