当前位置: 首页 > 知识库问答 >
问题:

使股份利润最大化(最大子数组)

左丘子平
2023-03-14

我在读“算法导论”。在最大子数组问题(第4章)中,作者提出不能仅仅通过求子数组的最大值和最小值来计算股票买卖的最大利润。作者通过计算所有可能的买进和卖出日期的组合来谈到替代方案,例如蛮力,这将需要0(n^2)个时间。另一种选择是寻找价格日变化数组的最大子数组。

然而,我编写了一个算法,它将花费0(n)个时间,并找到最大利润。这是在0(n)对0(nlogn)的最大子数组问题。但我知道作者不会错的。我哪里出错了?我的算法正确吗?

#include <stdio.h>
#include <limits.h>

int main(void) 
{
    int A[8]={10,8,3,9,7,4,5,10,4};
    int i,max,min,currmax,prevmax,n=8;

    max=INT_MIN;
    min=INT_MAX;
    for(i=0;i<n;i++)
    {
        if(A[i]>max)
        {
            max=A[i];
            prevmax=currmax;
            currmax=max-min;
        }
        if(A[i]<min)
        {
            min=A[i];
            max=INT_MIN;
        }

    }

    if(prevmax>currmax)
        printf("%d",prevmax);
    else
        printf("%d",currmax);

    return 0;
}

共有1个答案

余歌者
2023-03-14

在这里,你正在寻找最大的利益,你可以通过买卖一次股票(一次是重要的)。

你的算法假设最好的利润将产生于股票的最低执行价格。这是错误的:例如,A[]={10,23,6,12,4,1,0,3},程序输出3,而最大好处显然是13(关于Coliru的证明)

最佳效益的一个特征是计算股票固定的增量数组(您引用的A[]={-2,-5,6,-2,-3,1,5,-6}数组),然后得到最大子数组。在我的示例中,我们得到f[]={13,-17,6,-8,-3,-1,3},最大子数组是{13}。最终,所需利润为最大子数组之和。

#include <stdio.h>
#include <limits.h>

int main(void) 
{
    int A[8]={10,23,6,12,4,1,0,3};
    int i,min_i, profit_i, best_profit=0,n=8;

    min_i=A[0];
    for(i=1;i<n;i++)
    {
        profit_i = A[i] - min_i;
        best_profit = (profit_i > best_profit) ? profit_i : best_profit;

        if(A[i]<min_i)
        {
            min_i=A[i];
        }

    }

    printf("Best profit: %d", best_profit);
    return 0;
}

有不必要的局部变量,但我发现它们使逻辑更容易看到。

 类似资料:
  • 题目链接 Leetcode:121. Best Time to Buy and Sell Stock 题目描述 可以有一次买入和一次卖出,买入必须在前。求最大收益。 解题思路 使用贪心策略,假设第 i 轮进行卖出操作,买入操作价格应该在 i 之前并且价格最低。 // java public int maxProfit(int[] prices) { if (prices == null |

  • 本文向大家介绍当可除数为2的数字在C ++中具有关联的利润时,最大化利润,包括了当可除数为2的数字在C ++中具有关联的利润时,最大化利润的使用技巧和注意事项,需要的朋友参考一下 我们给出了5个整数N,A,B,X和ÿ。目标是通过检查[1到N]范围内的数字之间是否存在来最大化利润。 一个数字是由A整除,则通过利润增长X。 一个数字是由乙整除然后通过利润增长ÿ。 对于范围内的特定数字,只能添加一次利润

  • 我试图在一个数组中找到具有最大和的邻接子数组。所以,对于数组 {5,15,-30,10,-5,40,10}

  • 很抱歉发了这么长的帖子,但我不明白我做错了什么。感谢您事先的帮助! 这里是当前面提到的列表作为输入给出时的输出,我已经经历并查看了每一个步骤,列表中的每一个消除在我看来都是合乎逻辑的,我不知道一个人怎么会以结束和105结束。如果有人能帮我理解,我会非常感激的!

  • 本文向大家介绍算法题:股票最大值。相关面试题,主要包含被问及算法题:股票最大值。时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 最大利润无外乎就是计算后面的数字减去前面的数字得到的一个最大的差值; 求总体的最大差值,需要的数据:当前的最小值,当前的最大差值;遍历求解即可。 C++ 代码示例:  

  • 计算newArr数组所有对象中arr二维数组,比较后返回其中的[[最小值,最小值],[最大值,最大值]]; 要这种结果[[39.867638888888884, 115.39333333333333], [50.97152777777777, 120.31527777777778]]