Given a single positive integer x
, we will write an expression of the form x (op1) x (op2) x (op3) x ...
where each operator op1
, op2
, etc. is either addition, subtraction, multiplication, or division (+
, -
, *
, or /)
. For example, with x = 3
, we might write 3 * 3 / 3 + 3 - 3
which is a value of 3.
When writing such an expression, we adhere to the following conventions:
- The division operator (
/
) returns rational numbers. - There are no parentheses placed anywhere.
- We use the usual order of operations: multiplication and division happen before addition and subtraction.
- It is not allowed to use the unary negation operator (
-
). For example, "x - x
" is a valid expression as it only uses subtraction, but "-x + x
" is not because it uses negation.
We would like to write an expression with the least number of operators such that the expression equals the given target
. Return the least number of operators used.
Example 1:
Input: x = 3, target = 19 Output: 5 Explanation: 3 * 3 + 3 * 3 + 3 / 3. The expression contains 5 operations.
Example 2:
Input: x = 5, target = 501 Output: 8 Explanation: 5 * 5 * 5 * 5 - 5 * 5 * 5 + 5 / 5. The expression contains 8 operations.
Example 3:
Input: x = 100, target = 100000000 Output: 3 Explanation: 100 * 100 * 100 * 100. The expression contains 3 operations.
Constraints:
2 <= x <= 100
1 <= target <= 2 * 108
Companies:
Bloomberg
Related Topics:
Math, Dynamic Programming
// OJ: https://leetcode.com/problems/least-operators-to-express-number/
// Author: github.com/lzl124631x
// Time: O(?)
// Space: O(?)
// Ref: https://leetcode.com/problems/least-operators-to-express-number/discuss/208445/c%2B%2B-recursive-easy-to-understand
class Solution {
public:
int leastOpsExpressTarget(int x, int target) {
if (x > target) return min(target * 2 - 1, (x - target) * 2); // either adding x/x target times or subtract x/x (x - target) times from x
if (x == target) return 0;
long long prod = x, times = 0;
while (prod < target) { // greedily multiply x as much as possible
times++;
prod *= x;
}
if (prod == target) return times; // target is power `times` of x
int subtract = INT_MAX;
if (prod - target < target) subtract = times + 1 + leastOpsExpressTarget(x, prod - target); // Unproved heuristic: If `prod - target >= target`, it will take the same or more operations than what is required by `target`.
int add = times + leastOpsExpressTarget(x, target - (prod / x)); // using addition
return min(subtract, add);
}
};