964. 表示数字的最少运算符#
问题描述#
给定一个正整数
x
,我们将会写出一个形如x (op1) x (op2) x (op3) x ...
的表达式,其中每个运算符op1
,op2
,… 可以是加、减、乘、除(+
,-
,*
,或是/
)之一。例如,对于x = 3
,我们可以写出表达式3 * 3 / 3 + 3 - 3
,该式的值为 3 。在写这样的表达式时,我们需要遵守下面的惯例:
- 除运算符(
/
)返回有理数。- 任何地方都没有括号。
- 我们使用通常的操作顺序:乘法和除法发生在加法和减法之前。
- 不允许使用一元否定运算符(
-
)。例如,“x - x
” 是一个有效的表达式,因为它只使用减法,但是 “-x + x
” 不是,因为它使用了否定运算符。我们希望编写一个能使表达式等于给定的目标值
target
且运算符最少的表达式。返回所用运算符的最少数量。
示例 1:
输入:x = 3, target = 19 输出:5 解释:3 * 3 + 3 * 3 + 3 / 3 。表达式包含 5 个运算符。
示例 2:
输入:x = 5, target = 501 输出:8 解释:5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5 。表达式包含 8 个运算符。
示例 3:
输入:x = 100, target = 100000000 输出:3 解释:100 * 100 * 100 * 100 。表达式包含 3 个运算符。
提示:
2 <= x <= 100
1 <= target <= 2 * 10^8
解题思路#
问题就是将 \(\text{target}\) 表示为
其中 \(x^0=\boxed{x\div x}\),\(0\le\vert a_i \vert \lt x\),即 \(a_i\) 可正、可负、可为 0。
当 \(i=0\) 时,\(\boxed{\pm x^0}=\boxed{\pm x\div x}\) 需要 2 个运算符,所以 \(a_0x^0\) 需要 \(2a_0\) 个运算符;
当 \(i=1\) 时,\(\boxed{\pm x^1}=\boxed{\pm x}\) 需要 1 个运算符,所以 \(a_1x^1\) 需要 \(a_1\times 1\) 个运算符;
当 \(i=2\) 时,\(\boxed{\pm x^2}=\boxed{\pm x\times x}\) 需要 2 个运算符,所以 \(a_2x^2\) 需要 \(a_2\times 2\) 个运算符;
同理,当 \(i>=1\) 时,\(a_ix^i\) 需要 \(a_i\times i\) 个运算符。
所以需要的总的运算符数量为:
减去 1 是因为,表达式前面的运算符可以去掉,将一个为正的 \(a_i\) 放在首位即可。
因为 \(a_i\) 可正可负,而根据等式:
当 \(a_i\) 为正时,\(a_i^+=\frac{\text{target}}{x^i}\bmod x\),此时相当于 \(\text{target}-a_i^+ x^i\)。
当 \(a_i\) 为负时,\(a_i^-=\frac{\text{target}}{x^i}\bmod (-x)=-(x-a_i^+)\),此时相当于 \(\text{target}+(x-a_i^+)x^i\)。
所以整个过程就相当于搜索一棵二叉树。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|