zoukankan      html  css  js  c++  java
  • 650. 2 Keys Keyboard

    Initially on a notepad only one character 'A' is present. You can perform two operations on this notepad for each step:

    1. Copy All: You can copy all the characters present on the notepad (partial copy is not allowed).
    2. Paste: You can paste the characters which are copied last time.

    Given a number n. You have to get exactly n 'A' on the notepad by performing the minimum number of steps permitted. Output the minimum number of steps to get n 'A'.

    Example 1:

    Input: 3
    Output: 3
    Explanation:
    Intitally, we have one character 'A'.
    In step 1, we use Copy All operation.
    In step 2, we use Paste operation to get 'AA'.
    In step 3, we use Paste operation to get 'AAA'.
    

    Note:

    1. The n will be in the range [1, 1000].

    Approach #1: DP. [Java]

    class Solution {
        public int minSteps(int n) {
            int[] dp = new int[n+1];
            
            for (int i = 2; i <= n; ++i) {
                dp[i] = i;
                for (int j = i-1; j > 1; --j) {
                    if (i % j == 0) {
                        dp[i] = dp[j] + (i/j);
                        break;
                    }
                }
            }
            
            return dp[n];
        }
    }
    

      

    Approach #2: Greedy. [C++]

        public int minSteps(int n) {
            int s = 0;
            for (int d = 2; d <= n; d++) {
                while (n % d == 0) {
                    s += d;
                    n /= d;
                }
            }
            return s;
        }
    

      

    Analysis:

    We look for a divisor d so that we can make d copies of (n / d) to get n. The process of making d copies takes d steps (1 step of copy All and d-1 steps of Paste)

    We keep reducing the problem to a smaller one in a loop. The best cases occur when n is decreasing fast, and method is almost O(log(n)). For example, when n = 1024 then n will be divided by 2 for only 10 iterations, which is much faster than O(n) DP method.

    The worst cases occur when n is some multiple of large prime, e.g. n = 997 but such cases are rare.

    Reference:

    https://leetcode.com/problems/2-keys-keyboard/discuss/105897/Loop-best-case-log(n)-no-DP-no-extra-space-no-recursion-with-explanation

    https://leetcode.com/problems/2-keys-keyboard/discuss/105899/Java-DP-Solution

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    软工2021个人阅读作业#2——构建之法和CI/CD的运用
    2021年.Net中级开发工程师面试题
    OneForAll框架搭建之旅:Vue + .NetCore WebApi(3)
    创建WebService服务--.NET Core与SoapCore 及遇到的问题(二)
    创建WebService服务--.NET Framework(一)
    面试小记
    Vue开发环境安装
    java笔记之设计模式 1、创建型模式:工厂方法
    Abp太重了?轻量化Abp框架
    Tomcat学习2:一键启动以及源码阅读
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10517029.html
Copyright © 2011-2022 走看看