剑指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;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值