题解 | #完全平方数的草料#

完全平方数的草料

https://www.nowcoder.com/practice/0d467680d82046db866cf89beb861144

考察的知识点:动态规划;

解答方法分析:

  1. 创建一个大小为n+1的数组dp来保存最小完全平方数个数。初始时,将所有元素的值设置为无限大(即INT_MAX)。
  2. dp[0]设置为0,因为组成0的最小个数为0。
  3. 从1到n遍历每个数字i,对于每个数字i,再次从1遍历到i的平方根j。对于每个平方数jj,计算使得i-jj的数的最小个数,并将其与当前dp[i]的值进行比较,更新dp[i]为较小的那个。
  4. 创建一个大小为dp[n]的数组res来保存由完全平方数组成的最小个数。从res数组的最后一个位置开始,逐步向前遍历,找到每个完全平方数,并将其存入res数组中。
  5. 返回res数组作为最终的结果。

所用编程语言:C++;

完整编程代码:↓

class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return int整型vector
     */
    vector<int> numSquares(int n) {
        vector<int> dp(n + 1, INT_MAX);
        dp[0] = 0;
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j * j <= i; ++j) {
                dp[i] = min(dp[i], dp[i - j * j] + 1);
            }
        }
        vector<int> res(dp[n]);
        int index = res.size() - 1;
        while (n > 0) {
            for (int i = sqrt(n); i > 0; --i) {
                if (n >= i * i && dp[n] == dp[n - i * i] + 1) {
                    res[index--] = i * i;
                    n -= i * i;
                    break;
                }
            }
        }
        return res;
    }
};

全部评论

相关推荐

10-09 09:19
已编辑
沈阳农业大学 C++
修订
丿南烟丶:个人评价可以删掉 两个项目都是轮子项目,把一个转换成应用型项目,把MySQL和redis用起来 另外项目的时间可以标明一下
最后再改一次简历
点赞 评论 收藏
分享
09-17 17:09
门头沟学院 Java
雨忄:有人给出过解法,拖晚点去,然后到时候再找其他理由商量,既增加他们的筛人成本,不一定会给你收回offer ,也能占位避免工贼
秋招的嫡长offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务