Leetcode 650. 2 Keys Keyboard 2指键盘 解题报告
来源:互联网 发布:淘宝会员怎么注册 编辑:程序博客网 时间:2024/06/03 21:51
这道题可以转化成,给一个数字N,初始K=1,C=0然后只允许你有两种操作:
1、K = K + C (paste)
2 、C = K (copy all)
问,如何操作可以使得最快的得到N
N>1时,其实这道题就是将N分解为M个数字的乘积,且M个数字的和最小。
比如:
2 = 1 * 1 = 2
3 = 1 * 1 *1 = 3
4 = 2 * 2 = 1* 1* 1 *1 =4
等等
那么最快的讲一个数分解为N个质数的和怎们办呢
Initially on a notepad only one character 'A' is present. You can perform two operations on this notepad for each step:Copy All: You can copy all the characters present on the notepad (partial copy is not allowed).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: 3Output: 3Explanation: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:The n will be in the range [1, 1000].
给了两个方法,第一个是看别人的写的,第二个是我自己做的,速度似乎差不多
第一个主要是从小到大的去试探,尽量用小的数字去除就可以
大神简洁解法:39ms
class Solution(object): def minSteps(self, n): """ :type n: int :rtype: int """ res = 0 for i in range(2, n+1): while (n % i == 0): res += i n /= i return res
DP 递归 版 36ms
首先转化为两个数字的子问题,且A=B*C 且 B+C最小,就是指这两个数字的和最小(其实就是从B=sqrt(A),不断向下试探)找,然后对于这两个数字再进行递归。。记得加cache(不然就用字典,提前好到所有1000内的质数,这个更快):
class Solution(object): import math def helper(self, n): """ :type n: int :rtype: int """ if n in self.cache: return self.cache[n] for i in range(int(math.sqrt(n)),1,-1): if n % i == 0: a = self.helper(i) b = self.helper(n / i) self.cache[n] = a + b return a+ b self.cache[n] = n return n def minSteps(self, n): """ :type n: int :rtype: int """ self.cache = dict() self.cache[1] = 1 if n == 1: return 0 return self.helper(n)
阅读全文
0 0
- Leetcode 650. 2 Keys Keyboard 2指键盘 解题报告
- leetcode 650. 2 Keys Keyboard
- LeetCode -- 650. 2 Keys Keyboard
- Leetcode 650. 2 Keys Keyboard
- [LeetCode] 650. 2 Keys Keyboard
- leetcode 650. 2 Keys Keyboard
- [LeetCode] 650. 2 Keys Keyboard
- Leetcode: 650. 2 Keys Keyboard
- [LeetCode] 650. 2 Keys Keyboard
- LeetCode-2 Keys Keyboard
- LeetCode:2 Keys Keyboard
- leetcode 650. 2 Keys Keyboard(dp)
- LeetCode 650. 2 Keys Keyboard--动态规划
- [LeetCode] 650. 2 Keys Keyboard ## 题目描述
- 650. 2 Keys Keyboard
- 650. 2 Keys Keyboard
- 650. 2 Keys Keyboard
- 650. 2 Keys Keyboard
- java-工具-tomcat-加载机制
- 【LeetCode】136 Single Number
- 1.8 C# 继承和继承关系中的构造函数
- python day05 编写一个给定多项式的简易计算机 re模块及正则匹配应用
- JavaScript数据类型
- Leetcode 650. 2 Keys Keyboard 2指键盘 解题报告
- 【LeetCode】238. Product of Array Except Self
- Python3笔记-廖雪峰
- React 如何阻止事件冒泡?
- JavaScript
- Java 数组的插入排序
- Cookie/Session机制详解
- JAVASE基础(八)
- LOJ6212-「美团 CodeM 决赛」melon