Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
Algorithm 查找特定函数的最小操作数_Algorithm_Optimization_Data Structures - Fatal编程技术网

Algorithm 查找特定函数的最小操作数

Algorithm 查找特定函数的最小操作数,algorithm,optimization,data-structures,Algorithm,Optimization,Data Structures,我从一家公司的面试中得到了这个问题,但我找不到最小值(根据我的说法,最小值是最高值或最低值),但我不确定。 有人能帮我吗? 谢谢 问题是:- 给定一个数组和一个操作foo(索引,值) 值可以是1或-1 如果调用了foo(index,value),它将向从index到数组末尾的所有元素添加value 查找使所有数组元素为0的最小操作数 考虑每个元素与前一个元素之间的差异。对于第一个元素,使用0的差值,即其值 现在,调用foo(index,value)将恰好改变其中一个差异,或者增加它,或者减少

我从一家公司的面试中得到了这个问题,但我找不到最小值(根据我的说法,最小值是最高值或最低值),但我不确定。 有人能帮我吗? 谢谢

问题是:-

给定一个数组和一个操作
foo(索引,值)

  • 值可以是1或-1
  • 如果调用了
    foo(index,value)
    ,它将向从
    index
    到数组末尾的所有元素添加
    value
查找使所有数组元素为0的最小操作数


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

现在,调用foo(index,value)将恰好改变其中一个差异,或者增加它,或者减少它1


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

让我们用元素命名数组
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]

步骤3

[0, 0, 0 , a[3] - a[1] - (a[2] - a[1]), ...., a[n] - a[1] - (a[2] - a[1])]
或者只是

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提到的