剑指offer 63 lintcode149. 买卖股票的最佳时机、150. 买卖股票的最佳时机 II、151 买卖股票的最佳时机 III

149. 买卖股票的最佳时机

假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。

样例

给出一个数组样例 [3,2,3,1,2], 返回 1 

思想:写出其,每天的股票跌落数组[-1,1,-2,,1],然后求其最大子数组。

代码:

class Solution {
public:
    /*
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    int maxProfit(vector<int> &prices) {
        // write your code here
        if(prices.empty()||prices.size()==1)
            return 0;
            vector<int>price;
        for(int i=0;i<prices.size()-1;i++)
        {
          price.push_back(prices[i+1]-prices[i]);
        }
        int sum=0,max=0;
        for(int i=0;i<price.size();i++)
        {    
            sum+=price[i];
            if(max<sum)
            {
              max=sum;
             
            }
            if(sum<0)
           {
              sum=0;
           }
        }
        return max;
    }
};

思想二:对于每一天来说,它能得到的最大利益就是它和之前最低点的差

 

class Solution {
public:
    /*
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    int maxProfit(vector<int> &prices) {
        // write your code here
        int ret = 0;  
        if(prices.size()<2)  
            return ret;  
        int lowest = prices[0];  
        for(int i=1;i<prices.size();i++)  
        {  
            int cur = prices[i];  
            ret = max(ret,cur-lowest);  
            lowest  = min(lowest,cur);  
        }  
        return ret;  
    }  
};  

150. 买卖股票的最佳时机 II

假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格。设计一个算法来找到最大的利润。你可以完成尽可能多的交易(多次买卖股票)。然而,你不能同时参与多个交易(你必须在再次购买前出售股票)。

样例

给出一个数组样例[2,1,2,0,1], 返回 2

只要后一个数比前一个数大,就买,卖;

class Solution {
public:
    /*
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    int maxProfit(vector<int> &prices) {
        // write your code here
         int profit=0;
         if(prices.size()<2)
         return profit;
          for(int i=1;i<prices.size();i++)
          {   
             if(prices[i]>prices[i-1])
             profit+=prices[i]-prices[i-1];
          }
          return profit;
    }
};

买卖股票的最佳时机 III

假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。

思路:最大子数组2的变形;

代码:

class Solution {
public:
    /**
     * @param prices: Given an integer array
     * @return: Maximum profit
     */
    int maxProfit(vector<int> &prices) {
        // write your code here
        if(prices.size()==0||prices.size()==1)
        return 0;
        vector<int>price;
       
        for(int i=0;i<prices.size()-1;i++)
         price.push_back(prices[i+1]-prices[i]);
       
        if(price.size()==1)
        {
            if(price[0]>0)
            return price[0];
            else 
            return 0;
        }
        int sum=0;
        int sum_max=0;
        int maxvalue_left[price.size()-1]={0};
        for(int i=0;i<price.size();i++)
        {
            sum+=price[i];
            if(sum<0)
            sum=0;
            if(sum_max<sum)
            sum_max=sum;
            maxvalue_left[i]=sum_max;
        }
        sum=0;
        sum_max=0;
        int maxvalue_right[price.size()-1]={0};
        for(int i=price.size()-1;i>=0;i--)
        {
            sum+=price[i];
            if(sum<0)
            sum=0;
            if(sum_max<sum)
            sum_max=sum;
            maxvalue_right[i]=sum_max;
        }
        int res=0;
        for(int i=0;i<price.size()-1;i++)
         res=max(res,maxvalue_right[i+1]+maxvalue_left[i]);
        return res;
    }
};

 



 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值