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

完全平方数的草料

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

全部评论

相关推荐

01-21 20:09
武汉大学 Java
点赞 评论 收藏
分享
刷到过很多实习生和mentor处成哥们儿的帖子,看完大概率会羡慕这种亲近的上下级关系。但我想说,不管你跟带教的关系有多铁或者多僵,都得拎清课题分离这事儿,工作的边界感千万不能乱踩!📝&nbsp;下面这几条雷区,实习生们可千万别踩!1.别越级瞎提建议除非带教主动问你想法,否则别愣头愣脑地凑上去说&nbsp;“我觉得你应该咋样咋样”。咱就管好自己那一亩三分地,把本职工作干明白就够了,别瞎操心不属于自己的事儿。2.别卖队友换好感❌那种把实习生之间的小秘密捅出去,就为了换带教或者同事认可的操作,纯纯是作死。尤其是那些会影响到别人的话,比如&nbsp;“她就是嫌通勤远才请假”“他们偷偷建了个小群吐槽”,这话一出口,不仅把同事的信任踩碎了,自己还得惹一身麻烦。3.别养成反驳甩锅的臭毛病📗犯了错第一反应别是找借口、甩锅,那没啥用。不如沉下心复盘问题出在哪儿,琢磨个解决方案出来,保证下次不再掉坑里,这才是正经事。4.别瞎掺和正职的八卦我之前实习的组氛围贼好,正职们经常聊对象、聊恋爱进展啥的。但人家正职能聊,不代表咱实习生能跟着掺和。乖乖当个安静的吃瓜群众,竖起耳朵听着就行,别瞎插嘴,当个小透明准没错👂4.别随便评价别人的人品背后嚼舌根说别人咋样咋样,很容易让人觉得你没分寸。你聊啥,别人就可能觉得你认同啥,职场里保持中立,少议论人,才是最稳的。
omega@1112:唯一的大雷其实是不要问mentor的薪资待遇
mt对你说过最有启发的一...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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