找到特定功能的最小操作次数

时间:2018-06-03 12:50:34

标签: algorithm optimization data-structures

我从公司的采访中得到了这个问题,但我找不到最低限度(根据我的最低操作是最高数量或最低数量),但我不确定。 请有人帮帮我吗? 感谢

问题是: -

  

给定一个数组和一个操作foo(index, value)

     
      
  • value可以是1或-1,
  •   
  • 如果调用了foo(index, value),它会将value添加到从index到数组末尾的所有元素
  •   
     

找出使所有数组元素为0的最小操作数。

2 个答案:

答案 0 :(得分:7)

考虑每个元素与前一个元素之间的差异。对于第一个元素,使用与0的差值,即其值。

现在,调用foo(index,value)将改变其中一个差异,要么增加它,要么将它减少1。

由于你想要的结果所有这些差异都等于0,而foo()只能将其中一个改变为1,你需要调用foo()的最小次数是绝对值的总和。差异。

答案 1 :(得分:5)

让我们将数组a命名为元素

[a[0], a[1], a[2], ...., a[n]]

要使a[0]变为0的最小操作次数,请准确foo(0, 1)foo(0, -1)abs(a[0])次。在此之后,阵列将变为

[0, a[1] - a[0], a[2] - a[0], ...., a[n] - a[0]]

请注意,此结果不取决于a[0]是正还是负。

向前应用此逻辑,我们可以将结果汇总为

第1步(如上所述)

[0, a[1] - a[0], a[2] - a[0], a[3] - a[0], ...., a[n] - a[0]]次操作后

abs(a[0])

第2步

[0, 0, a[2] - a[0] - (a[1] - a[0]) , a[3] - a[0] - (a[1] - a[0]), ...., a[n] - a[0] - (a[1] - a[0])]

或只是

[0, 0, a[2] - a[1] , a[3] - a[1], ...., a[n] - a[1]]次操作后

abs(a[1] - a[0])

第3步

[0, 0, 0 , a[3] - a[1] - (a[2] - a[1]), ...., a[n] - a[1] - (a[2] - a[1])]

或只是

[0, 0, 0, a[3] - a[2] ...., a[n] - a[2]]次操作后

abs(a[2] - a[1])

<强> ... 步骤N + 1

[0, 0, 0, 0, ..., 0]次操作后

abs(a[n] - a[n-1])

所以最小操作次数是

abs(a[0]) + abs(a[1] - a[0]) + abs(a[2] - a[1]) + ... + abs(a[n] - a[n-1])

或只是

  

差异的绝对值之和

如Matt Timmermans所述