Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 最大切片问题_Javascript_Algorithm_Slice - Fatal编程技术网

Javascript 最大切片问题

Javascript 最大切片问题,javascript,algorithm,slice,Javascript,Algorithm,Slice,我正试图在Codibility的Javascript中解决以下算法问题: 给出了一个由N个整数组成的数组。 它包含股票连续N天的每日价格。 如果在P日购买单个股票,并在Q日出售, 其中0≤ P≤ Q400000)返回0 设lastStart=A[0] 设lastMax=A[0] 设diff=0 对于(i=0;i0?差异:0 } 这似乎是O(N),因此应该通过,但似乎失败了。 任何人都能看到这是什么原因。 我知道还有其他方法可以解决这个问题,但我真的很想知道为什么这个方法没有达到时间限制 谢谢

我正试图在Codibility的Javascript中解决以下算法问题:

给出了一个由N个整数组成的数组。
它包含股票连续N天的每日价格。
如果在P日购买单个股票,并在Q日出售,
其中
0≤ P≤ Q

那么该交易的利润等于
A[Q]− A[P]

前提是
A[Q]≥ A[P]

否则,交易将导致
A[p]的损失− A[Q]

例如,考虑下面的数组A,由六个元素组成,例如:

  A[0] = 23171
  A[1] = 21011
  A[2] = 21123
  A[3] = 21366
  A[4] = 21013
  A[5] = 21367
  A[0] = 23171
  A[1] = 21011
  A[2] = 21123
  A[3] = 21366
  A[4] = 21013
  A[5] = 21367
如果股票在第0天购买,第2天出售,则会发生
2048
的损失,因为
a[2]− A[0]=21123− 23171 = −2048年

如果股票在第4天买入,在第5天卖出,利润将达到
354
,因为
a[5]− A[4]=21367− 21013=354

最大可能利润为
356

如果股票在第一天买入,在第五天卖出,就会发生这种情况

写一个函数

函数解(A)

给定一个由N个整数组成的数组A,该数组包含连续N天内股票的每日价格,返回该期间内一笔交易的最大可能利润。
如果无法获得任何利润,则函数应返回0

例如,给定由六个元素组成的数组:

  A[0] = 23171
  A[1] = 21011
  A[2] = 21123
  A[3] = 21366
  A[4] = 21013
  A[5] = 21367
  A[0] = 23171
  A[1] = 21011
  A[2] = 21123
  A[3] = 21366
  A[4] = 21013
  A[5] = 21367
如上所述,该函数应返回
356

为以下假设编写有效的算法:

N
是范围
[0..400000]
内的整数;
数组A的每个元素都是
[0..200000]
范围内的整数

这是我目前的解决方案,它在“从[100K..120K]开始的200K值的混沌序列,然后是从[0..100K]开始的200K值”的性能上失败,但成功时间晚了0.07秒

function solution(A) {
    length = A.length
    if (A > 400000) return 0
    let lastStart = A[0]
    let lastMax = A[0]
    let diff = 0
    for (i=0; i < length; i++){
        if (A[i] < lastMax) lastMax = A[i]
        if (A[i] < lastStart) lastStart = A[i]
        if (A[i] > lastMax) {
            lastMax = A[i]
            if (lastMax - lastStart > diff) diff = lastMax - lastStart
        }
    }
    return diff > 0 ? diff : 0
}
函数解决方案(A){
长度
如果(A>400000)返回0
设lastStart=A[0]
设lastMax=A[0]
设diff=0
对于(i=0;ilastMax){
lastMax=A[i]
如果(lastMax-lastStart>diff)diff=lastMax-lastStart
}
}
返回差异>0?差异:0
}
这似乎是O(N),因此应该通过,但似乎失败了。
任何人都能看到这是什么原因。
我知道还有其他方法可以解决这个问题,但我真的很想知道为什么这个方法没有达到时间限制

谢谢

就这么简单(通过所有测试):

函数解决方案(A){
设min=A[0]
设dif=0
for(设i=1;idif)
dif=A[i]-min
}
返回dif
}
  • 下一行什么也不做:
    if(A>400000)返回0
  • 在这里,您可能应该将
    更改为code>
或完全省略该行:
如果(A[i]
  • 您的逻辑似乎是错误的,如果您看到一个新的最大值,您只能更改
    diff
    。尽管这并不重要,因为您以前重置了
    lastMax
  • 因此,您的代码似乎工作正常,只是一些小的改进。我的猜测是,如果许多人同时提交解决方案,则需要更长的时间,并且您无法通过性能测试。

    就这么简单(通过所有测试):

    函数解决方案(A){
    设min=A[0]
    设dif=0
    for(设i=1;idif)
    dif=A[i]-min
    }
    返回dif
    }
    
    • 下一行什么也不做:
      if(A>400000)返回0
    • 在这里,您可能应该将
      更改为code>
      或完全省略该行:
      如果(A[i]
    • 您的逻辑似乎是错误的,如果您看到一个新的最大值,您只能更改
      diff
      。尽管这并不重要,因为您以前重置了
      lastMax

    因此,您的代码似乎工作正常,只是一些小的改进。我的猜测是,如果许多人同时提交解决方案,则需要更长的时间,并且性能测试失败。

    您可以将
    lastMax-lastStart
    保存在变量中,而不是计算两次。你也应该使用局部变量,不要隐式地创建全局变量(这样做既草率又会导致更长的执行时间IIRC)。我想知道
    A>400000
    实际上做了什么。我想您的意思是
    length>400000
    。您可以将
    lastMax-lastStart
    保存在一个变量中,而不是计算两次。你也应该使用局部变量,不要隐式地创建全局变量(这样做既草率又会导致更长的执行时间IIRC)。我想知道
    A>400000
    实际上做了什么。我猜你的意思是
    length>400000
    。它以正确的方式通过了所有其他性能测试,但它只通过了特定的性能测试test@HappyMachine也许这取决于有多少人同时提交解决方案。实际上我提交了你的代码(刚刚删除了if(A>400000)它通过了所有测试。这很有趣,这表明检查足以提高性能,我对另一个无法改进的算法也有同样的问题。谢谢,我会检查这个!它通过了正确的性能测试和所有其他性能测试,它只会不通过特定的性能测试test@HappyMachine也许这取决于有多少人le正在同时提交解决方案。实际上,我提交了您的代码(刚刚删除了if(A>400000),它通过了所有测试。tha