此博客链接:https://www.cnblogs.com/ping2yingshi/p/14511914.html
股票的最大利润
题目链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/
题目
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
题解
错误思路1
先遍历数组找数组中的最小值,然后找最小值后面的最大值,求最大值和最小值的差值。
代码
class Solution { public int maxProfit(int[] prices) { int len=prices.length; if(len==0) { return 0; } int min=prices[0]; int minindex=0; int maxindex=0; for(int i=1;i<len;i++) { if(min>prices[i]) { min=prices[i]; minindex++; } } if(minindex==len-1) { return 0; } int max=prices[minindex]; for(int i=minindex;i<len;i++){ if(max<prices[i]) { max=prices[i]; } } return max-min; } }
思路2
使用滑动窗口,找滑动窗口内差值最大的值,差值中需要后面的数比前面的数大。可是我不知道滑动窗口大小定义多少。
官方题解
方法1
说明
差值,利用双重循环,找出差值最大的数。
代码
class Solution { public int maxProfit(int[] prices) { int len=prices.length; int max=0; for(int i=0;i<len;i++) { for(int j=i+1;j<len;j++) { if(prices[j]-prices[i]>max) { max=prices[j]-prices[i]; } } } return max; } }
结果
方法2
说明
先找出当前中包含的最小值,然后判断当前值减去最小值的差值是否是整个数组中最大的,返回最大差值。
代码
class Solution { public int maxProfit(int[] prices) { int len=prices.length; if(len==0) return 0; int min=prices[0]; int max=0; for(int i=0;i<len;i++) { if(min>prices[i]) { min=prices[i]; } if(prices[i]-min>max) { max=prices[i]-min; } } return max; } }