股票买卖的最大收益 java_【Java】 剑指offer(63) 股票的最大利润

本文探讨了如何使用Java解决股票交易中的最大利润问题,通过遍历价格数组并维护最低价,揭示了计算最大盈利的策略。重点对比了不亏本策略与允许亏损情况下的不同代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考自《剑指offer》一书,代码采用Java语言。

题目

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

思路

遍历每一个数字,并保存之前最小的数字,两者差最大即为最大利润。

值得注意的是,我自己一开始写的代码是默认不能亏本(即可以不买入卖出,利润不能为负数),所以比较简单;但如果可以亏本,最大利润指的是最小的亏损,那么要注意最小数字不能是最后一个。在下面的代码中可以注意比较两种情况的差别。可以考虑的例子如 { 16, 11, 7, 4, 2, 1 }

测试算例

1.功能测试(数组递增/递减/无序)

2.特殊测试(null,空数组)

3.边界值测试(数组仅两个数字)

Java代码

//题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股

//票可能获得的利润是多少?例如一只股票在某些时间节点的价格为{9, 11, 8, 5,

//7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能

//收获最大的利润11。

public class MaximalProfit {

public static int MaxDiff(int[] arr) {

if(arr==null || arr.length<2)

return -1; //error

int min=arr[0];

//最大利润可以是负数,只要亏损最小就行

int maxDiff=arr[1]-min;

for(int i=1;i

if(arr[i-1]

min=arr[i-1];

if(arr[i]-min>maxDiff)

maxDiff=arr[i]-min;

}

//默认不能亏本,代码简单,上面复杂的代码注意细节

//int maxDiff=0;

//for(int i=1;i

//if(arr[i]

//min=arr[i];

//else if(arr[i]-min>maxDiff)

//maxDiff=arr[i]-min;

//}

return maxDiff;

}

//简单快速测试下

public static void main(String[] args) {

int[] arr1=null;

System.out.println(MaxDiff(arr1)==-1);

int[] arr2={ };

System.out.println(MaxDiff(arr2)==-1);

int[] arr3={ 16, 16, 16, 16, 16 };

System.out.println(MaxDiff(arr3)==0);

int[] arr4={ 1, 2, 4, 7, 11, 16 };

System.out.println(MaxDiff(arr4)==15);

int[] arr5={ 16, 11, 7, 4, 2, 1 };

System.out.println(MaxDiff(arr5)==-1);

int[] arr6={ 9, 11, 5, 7, 16, 1, 4, 2 };

System.out.println(MaxDiff(arr6)==11);

int[] arr7={ 2,4};

System.out.println(MaxDiff(arr7)==2);

int[] arr8={ 4,2};

System.out.println(MaxDiff(arr8)==-2);

}

}

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

true

true

true

true

true

true

true

true

MaximalProfit

收获

1.蛮力法时间复杂度为O(n^2),肯定不对。我们从头到尾遍历,确定规律。可以发现找出之前的最小值即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值