Fork me on GitHub

【Offer】[63] 【股票的最大利润】

题目描述

  假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
  例如,一只股票在某些时间节点的价格为{9, 11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。

[牛客网刷题地址]无

思路分析

  我们先定义函数diff(i)为当卖出价为数组中第i个数字时可能获得的最大利润。显然,在卖出价固定时,买入价越低获得的利润越大。也就是说,如果在扫描到数组中的第i个数字时,只要我们能够记住之前的i-1个数字中的最小值,就能算出在当前价位卖出时可能得到的最大利润。

测试用例

  1. 功能测试:存储股票价格的数组无序、单调递增、单调递减。
  2. 边界值测试:存储股票价格的数组中只有两个数字。
  3. 特殊输入测试:指向数组的指针为nullptr。

Java代码

public class Offer063 {
    public static void main(String[] args) {
        test1();
        test2();
        test3();
        
    }

    public static int MaxDiff(int[] numbers) {
        return Solution1(numbers);
    }


    private static int Solution1(int[] numbers) {
        
        if(numbers==null || numbers.length<2) {
            return 0;
        }
        
        int min = numbers[0];
        int maxDiff = numbers[1] - min;
        
        for(int i=2;i<numbers.length;i++) {
            if(numbers[i-1]<min) {
                min = numbers[i-1];
            }
            int currDiff = numbers[i]-min;
            if(currDiff>maxDiff) {
                maxDiff = currDiff;
            }
        }
        
        return maxDiff;
    }

    private static void test1() {
        int[] numbers= {9, 11,8,5,7,12,16,14};
        System.out.println(MaxDiff(numbers));
    }

    private static void test2() {

    }
    private static void test3() {

    }

}

代码链接

剑指Offer代码-Java

posted @ 2019-09-02 14:44  这个世界~  阅读(245)  评论(0编辑  收藏  举报