【leetcode】Best Time to Buy and Sell Stock I&II&III

原创 2015年07月06日 23:06:59

Problem 1

这里写图片描述

Hint

DP

Code

int maxProfit(int* prices, int pricesSize) {
    if(!pricesSize) return 0;
    int cur = 0;
    int max = 0;
    for(int i=1;i<pricesSize;++i){
        cur += prices[i]-prices[i-1];
        if(cur<0) cur = 0;
        else if(cur>max) max = cur;
    }
    return max;
}

Problem 2

这里写图片描述

Hint

Greedy

Code

int maxProfit(int* prices, int pricesSize) {
    int sum = 0;
    for(int i=1;i<pricesSize;++i){
        sum += prices[i]-prices[i-1]>0?prices[i]-prices[i-1]:0;
    }
    return sum;
}

Problem 3

这里写图片描述

Hint

DP

Code

//打印数组
void printArray(int *array,int len,char *note){
    printf("%s\n",note);
    for(int i=0;i<len;++i)
        printf("%d ",array[i]);
    printf("\n");
}

//简化操作
int *simple(int *prices,int *pricesSize){
    int i=0;
    for(int i=1;i<*pricesSize;++i)
        prices[i-1] = prices[i]-prices[i-1];
    --(*pricesSize);
    //printArray(prices,*pricesSize,"After subtraction:");
    bool flag = prices[0]>=0?true:false;
    int count = 0;
    for(int i=1;i<*pricesSize;++i){
        if(flag){
            if(prices[i]>=0)
                prices[count]+=prices[i];
            else{
                flag = false;
                prices[++count]=prices[i];
            }
        }else{
            if(prices[i]<=0)
                prices[count]+=prices[i];
            else{
                flag = true;
                prices[++count]=prices[i];
            }
        }
    }
    *pricesSize = count+1;
    return prices;
}

//获取当前段最大利润
int maxProfitNow(int *prices,int pricesSize){
    int max = 0;
    int cur = 0;
    for(int i=0;i<pricesSize;++i){
        cur += prices[i];
        if(cur<0){
            cur = 0;
        }
        max = max>cur?max:cur;
    }

    return max;
}

//获取最大利润
int maxProfit(int* prices, int pricesSize) {
    if(pricesSize==1)   return 0;
    //简化
    int *simplestPrices = simple(prices,&pricesSize);
    //printArray(simplestPrices,pricesSize,"After simple:");
    //printf("\n");
    int max = 0;

    for(int i=0;i<pricesSize;++i){
        if(simplestPrices[i]<0){
            int tmp = maxProfitNow(simplestPrices,i) + \
                      maxProfitNow(simplestPrices+i+1,pricesSize-i-1);
            max = tmp>max?tmp:max;
            //printArray(prices,pricesSize,"Test");
            //printf("%d %d--\n",i,tmp);
        }
    }
    int tmp = maxProfitNow(simplestPrices,pricesSize);
    max = tmp>max?tmp:max;

    return max;
}

Summary

You may figure it out,that these problems are as the same with “Maximum subarray”.
So in the third solution,I simplify the prices’ array.And use the DP to calculate the maximum result from some maximum subarray.

版权声明:Pain is just in your mind.

【LeetCode-面试算法经典-Java实现】【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】

【121-Best Time to Buy and Sell Stock(最佳买卖股票的时间)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Say you have a...
  • DERRANTCM
  • DERRANTCM
  • 2015年08月14日 06:16
  • 6348

Best Time to Buy and Sell Stock II 最佳时间买入卖出股票(多次买卖)@LeetCode

package Level3; /** * Best Time to Buy and Sell Stock II * * Say you have an array for which t...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月07日 12:34
  • 9768

Best Time to Buy and Sell Stock 最佳时间买入卖出股票(一次买入卖出) @LeetCode

package Level2; /** * Best Time to Buy and Sell Stock * * Say you have an array for which the ...
  • hellobinfeng
  • hellobinfeng
  • 2013年10月19日 00:29
  • 1975

Best Time to Buy and Sell Stock III 最佳时间买入卖出股票(最多两次买卖)@LeetCode

直到要用DP做,但是一开始思路是错的。后来参考了 http://blog.csdn.net/pickless/article/details/12034365 才意识到可以在整个区间的每一点切开,然后...
  • hellobinfeng
  • hellobinfeng
  • 2013年11月08日 00:34
  • 20478

Best Time to Buy and Sell Stock III 两次买卖股票的最佳时机 (重重重)

题目: 只能买卖两次,er
  • skyoceanlover
  • skyoceanlover
  • 2014年08月21日 16:51
  • 779

【Leetcode】Stock Buy and Sell 系列问题 终极分析!

股票系列一共五个变种,这里先分析其中的三个。 第一个:https://leetcode.com/problems/best-time-to-buy-and-sell-stock/?tab=Descri...
  • u010900754
  • u010900754
  • 2017年02月20日 04:27
  • 244

动态规划的经典问题初探: Best Time to Buy and Sell Stock(DP)

1.DescriptionSay you have an array for which the ith element is the price of a given stock on day i....
  • w_bu_neng_ku
  • w_bu_neng_ku
  • 2017年10月26日 01:33
  • 51

Best Time to Buy and Sell Stock III(最多出手两次的多大获利)

出现的bugs: (1)由两个if的来计算序列的值,讨论了>和 (2)引用初始化。在两个函数里的两个参数引用初始化了同一个vector,结果是第二个引用参数由于iterator的更改而全部失效,也...
  • ylzintsinghua
  • ylzintsinghua
  • 2014年12月13日 16:14
  • 300

【Leetcode 动态规划】 买卖股票 I II III IV 冷却,共5题

买卖股票问题
  • Dr_Unknown
  • Dr_Unknown
  • 2016年07月18日 09:26
  • 4582

Python 学习 (Leetcode 算法题解【easy部分 技巧总结】)

使用python进行算法题目的练习,对python有了一个基本的了解,在此把这段时间以来学习到的在算法和编程方面的一点经验和技巧记录在此。在日后逐步深入学习的过程中,在慢慢对此进行丰富。如果可能,在完...
  • Hans__Yang
  • Hans__Yang
  • 2016年08月17日 19:30
  • 798
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【leetcode】Best Time to Buy and Sell Stock I&II&III
举报原因:
原因补充:

(最多只允许输入30个字)