Best Time to Buy and Sell Stock

本文介绍了三种求解股票买卖最大利润的算法实现方法,包括分治法、一次遍历法和动态规划法。通过这些方法可以高效地计算出在给定价格序列中能够获得的最大利润。

I:  Divide and Conquer

class Solution {
public:
    int max_Diff(vector<int> &prices, int start, int end, int *max, int *min) {
        if (start>=end) {
            *max=*min=prices[start];
            return 0;
        }
        int mid=(start+end)/2;
        int leftMax=0,leftMin=0,rightMax=0,rightMin=0;
        int leftDiff=max_Diff(prices, start, mid, &leftMax, &leftMin);
        int rightDiff=max_Diff(prices, mid+1, end, &rightMax, &rightMin);
        *max=(leftMax>rightMax)?leftMax:rightMax;
        *min=(leftMin<rightMin)?leftMin:rightMin;
        int maxDiff=rightMax-leftMin;
        maxDiff=(maxDiff>leftDiff)?maxDiff:leftDiff;
        maxDiff=(maxDiff>rightDiff)?maxDiff:rightDiff;
        return maxDiff;
    }
    int maxProfit(vector<int> &prices) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if (prices.size()<2) {
            return 0;
        }
        int min=0,max=0;
        return max_Diff(prices,0,prices.size()-1,&max,&min);
        
    }
};

遍历一遍,每次用当前的减之前最小的是当前的最大利润,更新最大利润。

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int n=prices.size();
        if (!n) return 0;
        int max=0, min=prices[0];
        for (int i=1; i<n; i++) {
            if (prices[i]-min>max) {
                max = prices[i]-min;
            }
            if (prices[i]<min) {
                min=prices[i];
            }
        }
        return max;
    }
};


II: 所有差的和

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        int n=prices.size();
        if (n<2) return 0;
        int res=0;
        for (int i=1; i<n; i++) {
            if (prices[i]>prices[i-1]) {
                res += prices[i]-prices[i-1];
            }
        }
        return res;
    }
};


III:DP

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(prices.size()<2) {
            return 0;
        }
        int res=0;
        vector<int> v1(prices.size());
        vector<int> v2(prices.size());
        int min=0;
        for (int i=1; i<prices.size(); i++) {
            if(prices[i]<prices[min]) {
                min=i;
            }
            v1[i]=v1[i-1]>(prices[i]-prices[min])?v1[i-1]:(prices[i]-prices[min]);
        }
        int max=prices.size()-1;
        for (int i=prices.size()-2; i>0; i--) {
            if(prices[i]>prices[max]) {
                max=i;
            }
            v2[i]=v2[i+1]>(prices[max]-prices[i])?v2[i+1]:(prices[max]-prices[i]);
        }
        for (int i=0; i<prices.size(); i++) {
            res=res>(v1[i]+v2[i])?res:(v1[i]+v2[i]);
        }
        return res;
    }
};


class Solution {
public:
    int maxProfit(vector &prices) {
        int max=0, n=prices.size();
        if (n==0) return 0;
        int low=INT_MAX, high=prices[n-1];
        vector profit(n,0);
        for (int i=0; i<n; i++) {
            if (prices[i]max) max=cur;
            profit[i]=max;
        }
        for (int i=n-2; i>0; i--) {
            if (prices[i]>high) high=prices[i];
            int cur=profit[i-1]+high-prices[i];
            if (cur>max) max=cur;
        }
        return max;
    }
};

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值