题目中只有两种操作,copy
和paste
,其中copy
必须拷贝当前的所有内容,最终得出n
个A
所需操作的最小次数。
最小次数,copy
全部,这两个在一开始就给予了我贪心的感觉,对于n
个A
来说,它期望的上一次操作是n/2
处整体复制粘贴过来,n/2
是n/4
…依次类推,就可以得到最小的次数。但很快我发现了上述思想的漏洞,举个例子,如果此时的n
是15
,那就没法通过n/2->n/4
这种模式。
15 = 3 * 5
,15
虽然不能通过上述的模式得来,但可以通过因数3
来操作得来。但很可惜在这里我并没有反应到质因数的层面。
分析到上面,那么问题的实现就简单了:
-
对于质数,它无法通过任何因数加速它,所以他的操作数就是它本身
-
对于合数,它可以通过因数来加速操作,但当时苦于想不出动态规划的转移方程,我选择从头到尾构建一个存储
[1,n]
的数组,数组值为最小操作数。
1.1 算法流程
-
freq[1-n]
依次赋值为1-n
,修改freq[1] = 0
-
遍历
2-n
,对于每次遍历更新其小于等于n
的所有倍数的最小次数 -
全部遍历完成后,返回
freq[n]
1.2 代码
def minSteps(n):
freq = [x for x in range(n + 1)]
freq[1] = 0
for i in range(2, n + 1):
j = 2
tmp = i * j
while tmp <= n:
依次更新当前i的倍数
freq[tmp] = min(freq[i] + j, freq[tmp])
j += 1
tmp = i * j
return freq[n]
2.1 动态规划
f[i]
表示打印出i
的A
的最少操作次数。
对于i来说,应先具有j
个A
,使用一次copy
操作,再使用若干次paste
操作,得到i
因此j
应当时i
的因数,粘贴的次数为i/j - 1
。
状态转移方程:
f[i] = min(f[j] + i / j) j是i的因数
def minSteps(n):
freq = [0] * (n + 1)
for i in range(2, n + 1):
freq[i] = float(“inf”)
j = 1
while j * j <= i:
if i % j == 0:
状态转移
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
更多面试题
**《350页前端校招面试题精编解析大全》**内容大纲主要包括 HTML,CSS,前端基础,前端核心,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等
,前端进阶,移动端开发,计算机基础,算法与数据结构,项目,职业发展等等**
[外链图片转存中…(img-eGEDL6cu-1713731569204)]