c语言股票问题--买股票的最佳时机(一笔交易 或 尽可能多次交易)

一笔交易

  给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。
  注意:你不能在买入股票前卖出股票。

ascdvfg

方法一:

int maxProfit(int* prices, int pricesSize)
{
    if (NULL == prices || pricesSize <= 1) return 0;
    //申请一个priceSize行两列的二维数组
    int** dp = (int**)malloc(sizeof(int)*pricesSize);
    for (int i = 0; i < pricesSize; ++i)
    {
       dp[i] = (int*)malloc(sizeof(int) * 2);
    }
    //初始化
    dp[0][0] = prices[0];
    dp[0][1] = 0;
    for (int i = 1; i < pricesSize; ++i)
    {
       dp[i][0] = fmin(dp[i - 1][0], prices[i]);
       dp[i][1] = fmax(dp[i - 1][1], prices[i] - dp[i][0]);
    }
    int res = dp[pricesSize - 1][1];//将结果赋值到res再返回
    for (int i = 0; i < pricesSize; ++i)//释放内存
    {
       free(dp[i]);
    }
    return res;
}

注意:c语言中数组的大小不能用变量定义,所以上述代码中动态申请了一个二维数组。但是力扣上直接使用dp[pricesSize][2]来定义二维数组,编译可以通过,VS2017上则不能编译通过。

方法二:

int maxProfit(const vector<int>& vec)
{
    int n = vec.size();
    int minp = INT_MAX;
    int maxp = 0;
    for (int i = 0; i < n; ++i)
    {
       if (vec[i] < minp)
       {
           minp = vec[i];
       }
       else if ((vec[i] - minp) > maxp)
       {
           maxp = vec[i] - minp;
       }
    }
    return maxp;
}
多笔交易

  设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
&emsps; 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
在这里插入图片描述

在这里插入图片描述方法一:

int calu(const vector<int>& vec,int s)//多笔交易
{
    if (s >= vec.size()) return 0;
    int n = vec.size();
    int max = 0;
    for (int i = s; i < n; ++i)
    {
        int maxp = 0;
        for (int j = i + 1; j < n; ++j)
        {
            if (vec[i] < vec[j])
            {
                int profit = calu(vec, j + 1) + vec[j] - vec[i];
                if (profit > maxp)
                {
                    maxp = profit;
                }
            }
        }
        if (maxp > max)
        {
            max = maxp;
        }
    }
    return max;
}
int maxSumProfit(const vector<int>& vec)
{
    return calu(vec, 0);
}

方法二:

int maxProfit(vector<int>& prices) 
{        
    int n = prices.size();  
    int maxp=0;     
    for(int i=1;i<n;++i)
    {
        if(prices[i]>prices[i-1])
        {
            maxp+=(prices[i]-prices[i-1]);
        }        
    }
    return maxp;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值