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的差值,即其值 现在,调用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提到的