博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 4 Keys Keyboard 四键的键盘
阅读量:7123 次
发布时间:2019-06-28

本文共 1794 字,大约阅读时间需要 5 分钟。

 

Imagine you have a special keyboard with the following keys:

Key 1: (A): Print one 'A' on screen.

Key 2: (Ctrl-A): Select the whole screen.

Key 3: (Ctrl-C): Copy selection to buffer.

Key 4: (Ctrl-V): Print buffer on screen appending it after what has already been printed.

Now, you can only press the keyboard for N times (with the above four keys), find out the maximum numbers of 'A' you can print on screen.

Example 1:

Input: N = 3Output: 3Explanation: We can at most get 3 A's on screen by pressing following key sequence:A, A, A

 

Example 2:

Input: N = 7Output: 9Explanation: We can at most get 9 A's on screen by pressing following key sequence:A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V

 

Note:

  1. 1 <= N <= 50
  2. Answers will be in the range of 32-bit signed integer.

 

这道题给了我们四个操作,分别是打印A,全选,复制,粘贴。每个操作都算一个步骤,给了我们一个数字N,问我们N个操作最多能输出多个A。我们可以分析题目中的例子可以发现,N步最少都能打印N个A出来,因为我们可以每步都是打印A。那么能超过N的情况肯定就是使用了复制粘贴,这里由于全选和复制要占用两步,所以能增加A的个数的操作其实只有N-2步,那么我们如何确定打印几个A,剩下都是粘贴呢,其实是个trade off,A打印的太多或太少,都不会得到最大结果,所以打印A和粘贴的次数要接近,最简单的方法就是遍历所有的情况然后取最大值,打印A的次数在[1, N-3]之间,粘贴的次数为N-2-i,加上打印出的部分,就是N-1-i了,参见代码如下:

 

解法一:

class Solution {public:    int maxA(int N) {        int res = N;        for (int i = 1; i < N - 2; ++i) {            res = max(res, maxA(i) * (N - 1 - i));        }        return res;    }};

 

这道题也可以用DP来做,我们用一个一维数组dp,其中dp[i]表示步骤总数为i时,能打印出的最多A的个数,初始化为N+1个,然后我们来想递推公式怎么求。对于dp[i]来说,求法其实跟上面的方法一样,还是要遍历所有打印A的个数,然后乘以粘贴的次数加1,用来更新dp[i],参见代码如下:

 

解法二:

class Solution {public:    int maxA(int N) {        vector
dp(N + 1, 0); for (int i = 0; i <= N; ++i) { dp[i] = i; for (int j = 1; j < i - 2; ++j) { dp[i] = max(dp[i], dp[j] * (i - j - 1)); } } return dp[N]; }};

 

这道题还有个O(1)时间复杂度的解法,好像利用了数学知识,不过博主貌似没太理解,参见,哪位大神给博主讲解一下?

 

类似题目:

 

参考资料:

 

转载地址:http://ggxel.baihongyu.com/

你可能感兴趣的文章
JS attribute and prpperty
查看>>
SpringMVC配置太多?试试SpringBoot
查看>>
详解js深浅复制
查看>>
Laravel 服务容器实现原理
查看>>
stl map
查看>>
什么是with?
查看>>
LeetCode Weekly Contest 21
查看>>
查询计划参数详解
查看>>
JS中把对象赋值给变量时出现的问题
查看>>
华为敏捷/DevOps实践:如何开好迭代计划会议
查看>>
AI+社交,快手商业化落地之道
查看>>
.NET Core中的去虚
查看>>
滴滴开源支撑业务代码重构工具Rdebug
查看>>
联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
查看>>
CNCF宣布Envoy项目正式毕业
查看>>
百度App网络深度优化系列(一):DNS优化
查看>>
Oracle发布多语种虚拟机平台GraalVM 1.0
查看>>
GCM 3.0采用类似方式向Android、iOS和Chrome发送消息
查看>>
如何进行5万并发用户负载测试?
查看>>
Java日志性能那些事
查看>>