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

完全平方数的草料

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题解

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务