列表

详情


650. 只有两个键的键盘

最初记事本上只有一个字符 'A' 。你每次可以对这个记事本进行两种操作:

给你一个数字 n ,你需要使用最少的操作次数,在记事本上输出 恰好 n 个 'A' 。返回能够打印出 n 个 'A' 的最少操作次数。

 

示例 1:

输入:3
输出:3
解释:
最初, 只有一个字符 'A'。
第 1 步, 使用 Copy All 操作。
第 2 步, 使用 Paste 操作来获得 'AA'。
第 3 步, 使用 Paste 操作来获得 'AAA'。

示例 2:

输入:n = 1
输出:0

 

提示:

相似题目

4键键盘

坏了的计算器

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minSteps(int n) { } };

java 解法, 执行用时: 4 ms, 内存消耗: 38.8 MB, 提交时间: 2022-12-06 13:59:20

class Solution {
    public int minSteps(int n) {
        int[] f = new int[n + 1];
        for (int i = 2; i <= n; ++i) {
            f[i] = Integer.MAX_VALUE;
            for (int j = 1; j * j <= i; ++j) {
                if (i % j == 0) {
                    f[i] = Math.min(f[i], f[j] + i / j);
                    f[i] = Math.min(f[i], f[i / j] + j);
                }
            }
        }
        return f[n];
    }
}

javascript 解法, 执行用时: 64 ms, 内存消耗: 42 MB, 提交时间: 2022-12-06 13:59:07

/**
 * @param {number} n
 * @return {number}
 */
var minSteps = function(n) {
    const f = new Array(n + 1).fill(0);
    for (let i = 2; i <= n; ++i) {
        f[i] = Number.MAX_SAFE_INTEGER;
        for (let j = 1; j * j <= i; ++j) {
            if (i % j === 0) {
                f[i] = Math.min(f[i], Math.floor(f[j] + i / j));
                f[i] = Math.min(f[i], Math.floor(f[i / j] + j));
            }
        }
    }
    return f[n];
};

golang 解法, 执行用时: 4 ms, 内存消耗: 2.2 MB, 提交时间: 2022-12-06 13:58:53

func minSteps(n int) int {
    f := make([]int, n+1)
    for i := 2; i <= n; i++ {
        f[i] = math.MaxInt32
        for j := 1; j*j <= i; j++ {
            if i%j == 0 {
                f[i] = min(f[i], f[j]+i/j)
                f[i] = min(f[i], f[i/j]+j)
            }
        }
    }
    return f[n]
}

func min(a, b int) int {
    if a > b {
        return b
    }
    return a
}

python3 解法, 执行用时: 136 ms, 内存消耗: 14.9 MB, 提交时间: 2022-12-06 13:58:37

class Solution:
    def minSteps(self, n: int) -> int:
        f = [0] * (n + 1)
        for i in range(2, n + 1):
            f[i] = float("inf")
            j = 1
            while j * j <= i:
                if i % j == 0:
                    f[i] = min(f[i], f[j] + i // j)
                    f[i] = min(f[i], f[i // j] + j)
                j += 1
        
        return f[n]

python3 解法, 执行用时: 36 ms, 内存消耗: 14.9 MB, 提交时间: 2022-12-06 13:57:42

class Solution:
    def minSteps(self, n: int) -> int:
        ans = 0
        i = 2
        while i * i <= n:
            while n % i == 0:
                n //= i
                ans += i
            i += 1
        
        if n > 1:
            ans += n
        
        return ans

javascript 解法, 执行用时: 56 ms, 内存消耗: 41.1 MB, 提交时间: 2022-12-06 13:57:27

/**
 * @param {number} n
 * @return {number}
 */
var minSteps = function(n) {
    let ans = 0;
    for (let i = 2; i * i <= n; ++i) {
        while (n % i === 0) {
            n = Math.floor(n / i);
            ans += i;
        }
    }
    if (n > 1) {
        ans += n;
    }
    return ans;
};

golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2022-12-06 13:57:13

func minSteps(n int) (ans int) {
    for i := 2; i*i <= n; i++ {
        for n%i == 0 {
            n /= i
            ans += i
        }
    }
    if n > 1 {
        ans += n
    }
    return
}

java 解法, 执行用时: 0 ms, 内存消耗: 38.1 MB, 提交时间: 2022-12-06 13:57:00

class Solution {
    public int minSteps(int n) {
        int ans = 0;
        for (int i = 2; i * i <= n; ++i) {
            while (n % i == 0) {
                n /= i;
                ans += i;
            }
        }
        if (n > 1) {
            ans += n;
        }
        return ans;
    }
}

上一题