LeetCode //C - 964. Least Operators to Express Number

964. Least Operators to Express Number

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 < = t a r g e t < = 2 ∗ 10 8 1 <= target <= 2 * 10^8 1<=target<=2∗108

From: LeetCode

Link: 964. Least Operators to Express Number


Solution:

Ideas:
  • For small values v <= x, directly compute the best using only 1s (x/x) or as x minus some 1s.

  • For larger values, find the closest power x^k and try:

    • Undershoot: use x^(k-1) and build the remainder.
    • Overshoot: use x^k and subtract the difference (only if it helps).
  • Use memoization to avoid recomputing subproblems.

Code:
c 复制代码
typedef struct {
    int key;
    int val;
} Pair;

static Pair memo[10000];
static int memoSize;

static int dfs(int x, int v) {
    // Base case: v <= x
    if (v <= x) {
        // Option 1: v = 1 + 1 + ... + 1 (v times)
        //   1 is x / x  -> 1 operator
        //   plus (v - 1) additions
        //   total = v (division) + (v - 1) (+) = 2*v - 1
        int op_add = 2 * v - 1;

        // Option 2: v = x - ( (x - v) ones )
        //   (x - v) ones: 2*(x - v) - 1 operators
        //   one more '-' to subtract from x
        //   total = 2*(x - v)
        int op_sub = 2 * (x - v);

        return op_add < op_sub ? op_add : op_sub;
    }

    // Check memo
    for (int i = 0; i < memoSize; ++i) {
        if (memo[i].key == v) return memo[i].val;
    }

    // Find smallest k such that x^k >= v
    int k = 2;
    long y = (long)x * x;   // y = x^2 initially
    while (y < v) {
        y *= x;
        ++k;               // now y = x^k
    }
    // Now y = x^k >= v, and y/x = x^(k-1)

    // Option 1 (undershoot):
    //   Use x^(k-1) once (cost k-1 multiplications),
    //   then express the remaining (v - x^(k-1))
    int op1 = (k - 1) + dfs(x, v - (int)(y / x));

    int ans = op1;

    // Option 2 (overshoot), only if the "over" part is smaller than v:
    //   Use x^k once (cost k multiplications),
    //   then express (x^k - v), and subtract it.
    if (y - v < v) {
        int op2 = k + dfs(x, (int)(y - v));
        if (op2 < ans) ans = op2;
    }

    // Save to memo
    memo[memoSize].key = v;
    memo[memoSize].val = ans;
    ++memoSize;

    return ans;
}

int leastOpsExpressTarget(int x, int target) {
    memoSize = 0;  // reset memo for each test case
    return dfs(x, target);
}
相关推荐
cpp_25019 小时前
P1540 [NOIP 2010 提高组] 机器翻译
数据结构·c++·算法·队列·noip·洛谷题解
晚笙coding9 小时前
LeetCode 98:验证二叉搜索树 —— 从局部判断到全局范围约束的递归思想
算法·leetcode·职场和发展
深念Y9 小时前
开发者如何清理和迁移C盘堆积的垃圾
c语言·开发语言
学计算机的计算基9 小时前
回溯算法下篇:四道经典题讲透约束剪枝、原地标记、预计算与状态压缩
java·笔记·算法
霸道流氓气质10 小时前
SpringBoot中实现告警判定算法-位报警与模拟量阈值-技术详解
spring boot·算法·jquery
十月的皮皮10 小时前
STM32从零到量产开发:四路继电器工业控制模块开发实战笔记(小白视角)
c语言·笔记·stm32·stm32cubemx·hal库
行者全栈架构师10 小时前
混元 Hy3 Agent 实战:季度报告 3 小时变 40 分钟
算法·架构·代码规范
兰令水10 小时前
hot100【acm版】【2026.7.21打卡-java版本】
java·开发语言·算法·leetcode·面试
好好沉淀11 小时前
主键选择(自增 vs UUID vs 雪花算法)
java·算法
天空'之城11 小时前
C 语言工业级通用组件手写 10:字节序转换
c语言·字节序·大小端·嵌入式通信·工业级组件