LeetCode650、只有两个键的键盘(数学、因子、dp)

题目描述

https://leetcode-cn.com/problems/2-keys-keyboard/
在这里插入图片描述

解法

单纯知道是动态规划,很难去思考它的递推过程。于是去看题解:
在这里插入图片描述
我们就知道它是如何思考的,不同于四键键盘问题,四键键盘问题它的目标是求得最大的操作数,本质也是遍历所有可能情况的最大值,但是却很直观。这道题则比较绕,如果我们不知道可以分组思考的话,比较难做。

class Solution {
    
    
    public int minSteps(int n) {
    
    
        int []dp = new int[n+1];
        dp[0] = 0;
        dp[1] = 0;//1个字符本来就存在
        for(int i=2;i<=n;i++){
    
    
            dp[i] = i;//最坏的情况,这里加了下面j就从j=2起步
            for(int j=2;j<=i/2;j++){
    
    //子区长度j为1的时候就是最坏情况。
                if(i%j==0){
    
    //是其因数,即可以分区
                    dp[i] = Math.min(dp[i],dp[j]+i/j);
                //dp【j】加cppp的操作,即第二组的长度

                }
            }
        }
        return dp[n];
    }
}

时间复杂度为O(n2)
在这里插入图片描述

当然,如果从官方题解的角度,复杂度上还可以优化:
在这里插入图片描述

class Solution {
    
    
    public int minSteps(int n) {
    
    
        int ans = 0, d = 2;
        while (n > 1) {
    
    //A个数
            while (n % d == 0) {
    
    //可以划分,一个分区长度是d
                ans += d;//长度就是操作数
                n /= d;//切换到另一个分区,长度是n/d
            }
            d++;//然后在下一个分区里面再次分区,如果它不能分区,必然会走到d==n的情况,然后ans+d.
        }
        return ans;
    }
}

在这里插入图片描述

在这里插入图片描述
参考官方题解:
https://leetcode-cn.com/problems/2-keys-keyboard/solution/zhi-you-liang-ge-jian-de-jian-pan-by-leetcode/

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/115253350
今日推荐