股票交易日(动态规划)----美团2016研发工程师编程题(二)

[编程题] 股票交易日

在股市的交易日中,假设最多可进行两次买卖(即买和卖的次数均小于等于2),规则是必须一笔成交后进行另一笔(即买-卖-买-卖的顺序进行)。给出一天中的股票变化序列,请写一个程序计算一天可以获得的最大收益。请采用实践复杂度低的方法实现。

给定价格序列prices及它的长度n,请返回最大收益。保证长度小于等于500。

测试样例:
[10,22,5,75,65,80],6
返回:87
之前做个一道 百度2016研发工程师在线编程题风口的猪,发现这两道题几乎一模一样!

我把风口的猪的代码直接粘贴过来就能运行,都是套路~~


class Stock {
public:
    int maxProfit(vector<int> vec, int n) {
        // write code here
        int sum = 0 ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            int tmp = get_max( vec, 0, i - 1 ) + get_max( vec, i, vec.size() - 1 ) ;
            if ( tmp > sum ) sum = tmp ;
        }
        
        return sum ;
    }
private :
    int get_max( vector<int>& vec, int left, int right ) {
        if ( left == right ) return 0 ;
        int min = vec[left] ;
        int max = 0 ;
        for ( int i = left + 1; i <= right; ++ i ) {
            if ( vec[i] < min ) min = vec[i] ;
            if ( vec[i] - min > max ) max = vec[i] - min ;
        }
        
        return max ;
    }
};

第二次做:

class Stock {
public:
    int maxProfit(vector<int> vec, int n) {
        // write code here
        int result = 0 ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            int tmp = getmax( vec, 0, i - 1 ) + getmax( vec, i, vec.size() - 1 ) ;
            result = max( result, tmp ) ;
        }
        return result ;
    }
private:
    int getmax( vector<int>& vec, int left, int right ) {
    	int max = 0 ;
        int min = vec[left] ;
        for ( int i = left; i <= right; ++ i ) {
            if ( vec[i] - min > max ) max = vec[i] - min ;
            if ( min > vec[i] ) min = vec[i] ;
        }
        return max ;
	}
};


风口的猪-中国牛市(动态规划)----百度2016研发工程师在线编程题

[编程题] 风口的猪-中国牛市
风口之下,猪都能飞。当今中国股市牛市,真可谓“错过等七年”。 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价。 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票。若两次交易机会都放弃,收益为0。 设计算法,计算你能获得的最大收益。 输入数值范围:2<=n<=100,0<=prices[i]<=100 
输入例子:
3,8,5,1,7,8

输出例子:
12
这是比较简单的动态规划了, 将问题划分为两部分即可。

class Solution {
public:
    /**
     * 计算你能获得的最大收益
     * 
     * @param prices Prices[i]即第i天的股价
     * @return 整型
     */
    int calculateMax(vector<int> vec) {
		int sum = 0 ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            int tmp = getmax( vec, 0, i - 1 ) + getmax( vec, i, vec.size() - 1 ) ;
            if ( tmp > sum ) sum = tmp ;
        }
        
        return sum ;
    }
    
private :
    int getmax( vector<int>& vec, int left, int right ) {
        if ( left == right ) return 0 ;
        int min = vec[left] ;
        int max = 0 ;
        for ( int i = left + 1; i <= right; ++ i ) {
            if ( vec[i] - min > max ) max = vec[i] - min ;
            if ( vec[i] < min ) min = vec[i] ;
        }
        return max ;
    }
};


第三次做:

class Stock {
public:
    int maxProfit(vector<int> vec, int n) {
        // write code here
        int result = 0 ;
        
        for ( int i = 0; i < vec.size(); ++ i ) {
            int tmp = getmax( vec, 0, i ) + getmax( vec, i + 1, vec.size() - 1 ) ;
            result = result > tmp ? result : tmp ;
        }
        
        return result ;
    }
private:
    int getmax( vector<int>& vec, int left, int right ) {
        int minv = vec[left] ;
        int maxv = 0 ;
        for ( int i = left; i <= right; ++ i ) {
            if ( minv > vec[i] ) minv = vec[i] ;
            if ( vec[i] - minv > maxv ) maxv = vec[i] - minv ;
        }
        return maxv ;
    }
};



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值