我从公司的采访中得到了这个问题,但我找不到最低限度(根据我的最低操作是最高数量或最低数量),但我不确定。 请有人帮帮我吗? 感谢
问题是: -
给定一个数组和一个操作
foo(index, value)
,
value
可以是1或-1,- 如果调用了
foo(index, value)
,它会将value
添加到从index
到数组末尾的所有元素找出使所有数组元素为0的最小操作数。
答案 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所述