算法思路借鉴于官方题解,添加了详细注释用于理解,刷题打卡
第一种思路是动态规划,也是我看到这道题的第一时间考虑到的解法,但是当时想的是记录每个步数最多能输出多少A,考虑了一会发现想歪了,题目求的是最少以及“恰好”,最多步数明显不是正确解,看了眼题解发现自己相反了T_T,思路对了代码就很好写了~
class Solution
{
public:
int minSteps(int n)
{ //动态规划,状态定义为每个数字需要的最少步数
vector<int> dp(n + 1);
dp[1] = 0;
for (int i = 2; i <= n; i++)
{
dp[i] = 1001;//题目给的范围是1 <= n <= 1000
for (int j = 1; j * j <= i; j++)
{
if (i % j == 0)
{
dp[i] = min(dp[i], dp[j] + i / j);
dp[i] = min(dp[i], dp[i / j] + j);
}
}
}
return dp[n];
}
};
第二种解法完全参照的题解,理解起来并不困难,但是笔者并不习惯用数学方法解题,所以分析的时候没往这方面想,感觉还是蛮巧妙的,代码实现也并不难。
class Solution {
public:
int minSteps(int n) {
int res;
for(int i=2;i*i<=n;i++)
{
while(n%i==0)
{
n/=i;
res+=i;
}
}
if(n>1)//当前即是质数的情况如3,直接返回
{
res+=n;
}
return res;
}
};
PS:前两天也有刷题,但是个人问题没有打卡T_T,甚至有一天一直在刷一个类型的题忘记了每日一题(要坚持!
本文介绍了一种动态规划的算法解决LeetCode650问题,即如何用最少的步骤从空字符串输出目标字符串,同时讨论了一种数学解法。作者分享了自己的解题思路,并提供了详细的注释和代码实现。
1161

被折叠的 条评论
为什么被折叠?



