达到目标的最小步骤,给定 (1, 0) 和操作 A = 2A - B 或 B = 2B - A

Minimum steps to reach target, given (1, 0) and operations A = 2A - B or B = 2B - A

我参加了面试,但我无法给出解决问题的最佳方法。

A=1, B=0
- Operation L: A=2A-B
- Operation R: B=2B-A

For each step, only one operation(L or R) is taken place.

For a given number N, what is the minimum number of operations required to make A or B equals to N?

最重要的是效率。

提前致谢。

在k次操作中你可以得到[-(2^k)+1, 2^k]中N的所有值。

注意 abs(A) + abs(B) = 2^k 对于所有可能的 k 路径,并且 A 和 B 正好覆盖范围 [-(2^k)+1, 2^k] in长度为 k 的路径集。

k=0: (1,0)
k=1: (1,-1), (2,0)
k=2: (1,-3), (2,-2), (3,-1), (4,0)
etc...

给定N,我们可以通过log找到最小的k。然后我们知道最后一对是 (N, N - 2^k) (或 (N-2^k, N) 如果 N <= 0)。沿着路径回到 k=0 很容易,因为对于下一个较小的 k,这两个元素之一将超出范围。

例如,N = 35。

Log2(35) = 5.13, so we use k=6.
2^6 = 64, so our final pair is (35, -29)
(35,-29) -> (3,-29) -> (3, -13) -> (3, -5) -> (3,-1) -> (1,-1) -> (1,0)

求出k是O(1),找到路径是O(k)也就是O(log(abs(N))。

你不太可能需要在面试中证明任何事情,但如果你这样做了,你可以使用这个:

通过观察:A - B = 2^k for k steps observed for small k.

然后通过归纳法:我们有一些有效的 (A, B) s.t。 A-B = 2^k。然后 L 得到我们 (2A-B, B),但是 2A-B-B = 2A-2B = 2(A-B) = 2^(k+1) 根据需要。同样对于 R.

这对于面试来说是一项具有挑战性的任务,但我会从递归开始,试图从结果中找到起源。给定有效 (A', B),其中 A' 是我们追求的目标,

A' = 2A - B

对于一些A,这意味着

A = (A' + B) / 2

后者告诉我们,路径中的所有(A' + B)都必须能被2整除,由于路径结束(开始)于1,所以其中的所有(A' + B)都是2的幂。

我们可以观察到另一个属性,虽然它可能与解决方案无关,但一旦我们在第一步切换到(even, even)(odd, odd),我们就无法切换回来.