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

完全平方数的草料

https://www.nowcoder.com/practice/0d467680d82046db866cf89beb861144?tpId=354&tqId=10595846&ru=/exam/oj&qru=/ta/interview-202-top/question-ranking&sourceUrl=%2Fexam%2Foj

动态规划

  1. 创建一个长度为n+1的整数数组dp,用来存储计算最小个数的中间结果。初始时,将数组中的所有元素都设置为最大值Integer.MAX_VALUE,除了dp[0]设置为0,表示组成0的最小个数为0。
  2. 使用两层循环来填充动态规划数组dp。外层循环遍历1到n的每个数,内层循环遍历1到当前数的平方根,计算当前数的最小个数。对于每个内层循环的迭代,通过比较dp[i]和dp[i - j * j] + 1的值,更新dp[i]为较小的那个。
  3. 创建一个整数数组res来存储最终的结果。初始化一个变量index为res数组的长度减1。
  4. 遍历数组dp,从n开始递减,找到每个平方数对应的最小个数。内层循环从当前数的平方根开始,迭代递减,检查是否满足n >= i * i且dp[n] == dp[n - i * i] + 1的条件,如果满足,则将当前平方数i * i放入res数组的index位置,index递减,同时更新n为n - i * i。重复此过程直到n变为0。
  5. 由于i*i是按照index递减存放故不需要再次排序

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param n int整型
     * @return int整型一维数组
     */
    public int[] numSquares (int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        //组成0的最小个数为0
        dp[0] = 0;

        //计算组成当前数的最小个数
        for (int i = 1; i <= n; ++i) {
            for (int j = 1; j * j <= i; ++j) {
                //j*j为一个完全平方数+dp[i],求最小组和个数
                dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
            }
        }
        int[] res = new int[dp[n]];
        int index = res.length - 1;
        while (n > 0) {
            for (int i = (int) Math.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;
    }
}

面试高频TOP202 文章被收录于专栏

面试高频TOP202题解

全部评论

相关推荐

10-31 14:54
已编辑
门头沟学院 算法工程师
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务