在您纠正问题以澄清除法是整数除法之前,我首先想到的是 GCD。
现在,我想出了两种算法
算法1:
- 取最大数,除以第二大,或等于第二大,每次除法增加计数器
- 如果它变成第二大,再次重复上述步骤。
- 如果它等于第 2 大,则开始将其与第 3 大进行比较,但现在,将计数器每除法一次(因为有 2 个相等的最大数),然后重复上述步骤。
前任 -
[64,32,17,36], div factor = 2, counter(ctr) = 0
64 -> 32, [32,32,17,36] steps = 1, ctr = 1
36 -> 18, [32,32,17,18] steps = 1, ctr = 2
32 -> 16, [16,16,17,18] steps = 1*2(as 2 values = 32) = 2, ctr = 4
18 -> 9, [16,16,17,9] steps = 1, ctr = 5
17 -> 8, [16,16,8,9] steps = 1, ctr = 6
16 -> 8, [8,8,8,9] steps = 1*2(as 2 values = 16) = 2, ctr = 8
9 -> 4, [8,8,8,4] steps = 1, ctr = 9
8 -> 4, [4,4,4,4] steps = 1*3(as 3 values = 8) = 3, ctr = 12
所以最小步数是 12。 (64 -> 4, 32 -> 3, 17 -> 2, 36 -> 3) = 4 + 3 + 2 +3 = 12
算法 2(更好)
- 从均衡对开始,从左到右移动。
- 随着左数的每一个除法,计数器增加右数的索引(或左数的索引+1)
- 每除以正确的数字,计数器加 1
- 继续直到你到达最后一对。
前任 -
[64,32,17,36], div factor 2, counter (ctr) = 0
(64,32),17,36 -> (32,32),17,36 => steps = 1*1 = 1, ctr = 1
32,(32,17),36 -> 8,(8,8),36 => steps = 2*2 + 1 = 5, ctr = 6
8,8,(8,36) -> 8,8,(4,4) => steps = 1*3 + 3 = 6, ctr = 12
答案 = 12