剑指offer第二版——面试题63(java)

面试题:股票的最大利润

题目:

假设吧某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少

如:一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14},如果在5买入16卖出,则收获最大利润11

思路:

股票交易的利润来自股票买入和卖出的差价,且只能在买入后卖出

如果把买入价和卖出价两个数字组成一个数对,则利润就是这个数对的差值

最大利润就是数组中所有数对的最大差值

一、可以用暴力解法——找出所有数对,逐一求差值,时间复杂度O(n)

二、

定义当卖出价为数组中第i个数字时可能获得的最大利润,当卖出价格固定时,买入价格越低利润越大

也就是说,如果在扫描到数组中的第i个数字时,只要我们能记住之前的i-1个数字中的最小值,则能算出在当前价位卖出时可能得到的最大利润

代码:

public class Q63 {
	public static void main(String[] args) {
		int[] a = new int[] {9,11,8,5,7,12,16,14};
		int re = maxDiff(a);
		System.out.println(re);
	}
	
	public static int maxDiff(int[] a) {
		if(a.length<2) {
			System.out.println("wrong input");
			return 0;
		}
		
		int min = a[0];
		int max = a[1]-a[0];
		
		for(int i=1;i<a.length;i++) {
			// 记录差值最大值
			if(a[i]-min>max) {
				max = a[i]-min;
			}
			
			// 记录最小值
			if(a[i]<min) {
				min = a[i];
			}				
		}
		return max;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_22527013/article/details/91400294