Leetcode121,Leetcode122| 买卖股票的最佳时机,买卖股票的最佳时机 II

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

 题解:

首先我们要明确一个概念叫做局部最小值

什么意思呢,我们知道高数里一个函数求最值,找出定义域内倒数为0的点和定义域的边界点,比较这几点的函数值

我们只卖卖一次股票,就找这个数组内差值最大的俩天卖出

有朋友会说(无中生有)那就找出数组最小值然后在他之后找那个范围的最大值不就行了

大错特错:我们得找差值最大

如果还不理解可以看看【7,100,3,6,4】,按照朋友的说法找出最小值3然后他之后的最大值是6,只赚了3rmb。资本家看了感动落泪,7和100差值就证明被忽略了

所以我们用个数,通过和他比较找出满足条件的买入日子

要满足前面没有比他更小的数了,(符合抄底思想),但后面不一定,因为为你没开天眼看不到后面有没有更抄底的日子了

用maxn存储和接下来每一天的差值,maxn保存的是最大的差值

你肯定会问后面遇到更抄底的时候怎么办??你有没有想过那是企业垂死之时了在野区涨不回去了,比如前面例子的3

但你肯定会说总有公司致之死地而后生的,比如【7,101,3,6,100】如何解决,这很符合局部最小值的查找方式if(price【i】<sma)sma=price[i]这句就包含了这种情况3前面没有比他更小的值了,继7之后他成为局部最小值,然后3用它所有差值和7遗留下来的最大差值比较,最后呢?当然是谁大留谁3和100之间的差值为97大于7和101的差值94所以我们在3那天买入

class Solution {
    public int maxProfit(int[] prices) {
        int maxn=0;//最大收益
        int big=0;//
        int sma=10005;//数据范围
        for(int i=0;i<prices.length;i++){
            if(prices[i]<sma)sma=prices[i];//状态转移把数据范围圈小,找到最小值和他之后的最大值
            if(prices[i]-sma>maxn){//找出差值最大的地方决定卖出
                maxn=prices[i]-sma;
            }
        }
        return maxn;
    }
}

Leetcode122给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

 题解:

这题和上一题不同的是,你不止能买卖一次,可以天天倒卖,这个时候我们可以想到最划算的做法是什么,那必然是天天卖出不怕涨只怕跌,如果第二天跌我就今天就抛售,如果第二天涨我就第二天抛售,这样一来风险完全不存在,大不了看到第二天跌了我立马卖掉,又不要手续费,就是今日收益为o而已

class Solution {
    public int maxProfit(int[] prices) {
        int res=0;
        for(int i=0;i<prices.length-1;i++){
            if(prices[i+1]>prices[i]){//第二天涨了
                res+=prices[i+1]-prices[i];//第二天卖
            }
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值