猫和鱼爪的鸟窝

Pain is in your mind.

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

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. https://blog.csdn.net/yzt33/article/details/46780473
文章标签: leetcode algorithm
个人分类: Algorithm
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭