首页 > 其他分享 >代码随想录——完全平方数(Leetcode 279)

代码随想录——完全平方数(Leetcode 279)

时间:2024-07-30 10:53:32浏览次数:12  
标签:平方 square int 随想录 整数 Integer 279 Leetcode dp

题目链接
在这里插入图片描述

动态规划

动态规划思路:

  • 状态定义:定义一个一维数组dp,其中dp[i]表示组成整数i所需的最少完全平方数的数量
  • 状态初始化:将dp数组中的所有元素初始化为Integer.MAX_VALUE,表示初始状态下组成每个整数的完全平方数数量是无限大(即不可能)。但dp[0]需要初始化为0,因为组成整数0不需要任何完全平方数
  • 状态转移:遍历所有可能的完全平方数,对于每个完全平方数square[i],更新dp数组。具体来说,对于当前完全平方数square[i],遍历所有从square[i]到n的整数,更新dp[j]的值。如果dp[j - square[i]]不是Integer.MAX_VALUE(即j - square[i]这个整数是可以凑出的),则更新dp[j]为min(dp[j - square[i]] + 1, dp[j])
  • 返回结果:最后,返回dp[n],即组成整数n所需的最少完全平方数的数量。

本人版本

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        int[] square = new int[100];
        for(int i = 0; i < square.length; i++){
            square[i] = (i + 1) * (i + 1);
        }
        // 初始状态下组成每个整数的完全平方数数量是无限大(即不可能)
        for (int j = 0; j <= n; j++) {
            dp[j] = Integer.MAX_VALUE;
        }
        dp[0] = 0;
        for(int i = 0; i < square.length; i++){
            for(int j = square[i]; j <= n; j++){
                dp[j] = Math.min(dp[j - square[i]] + 1, dp[j]);
            }
        }
        return dp[n];
    }
}

代码简化版本

class Solution {
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        for (int j = 0; j <= n; j++) {
            dp[j] = Integer.MAX_VALUE;
        }
        dp[0] = 0;
        for(int i = 1; i * i <= n; i++){
            for(int j = i * i; j <= n; j++){
                dp[j] = Math.min(dp[j - i * i] + 1, dp[j]);
            }
        }
        return dp[n];
    }
}

标签:平方,square,int,随想录,整数,Integer,279,Leetcode,dp
From: https://blog.csdn.net/qq_46574748/article/details/140791172

相关文章

  • 《LeetCode热题100》---<双指针篇四道>
    本篇博客讲解LeetCode热题100道双指针篇中的第一道:移动零(简单)第二道:盛最多水的容器(中等)第一道:移动零(简单)classSolution{publicvoidmoveZeroes(int[]nums){for(intcur=0,dest=-1;cur<nums.length;cur++){//采用双指针......
  • 代码随想录 day39 零钱兑换 | 完全平方数 | 单词拆分
    零钱兑换零钱兑换解题思路还是完全背包的套路,但这次我们要求的是最小值,因此每次遍历的时候我们要找到最小值,每次给dp增加的大小不在是物品的价值而是长度,所以+1。知识点完全背包心得难点在于怎么样找到最小值完全平方数[完全平方数(https://programmercarl.com/0279.完......
  • LeetCode - #107 二叉树的层序遍历 II
    文章目录前言1.描述2.示例3.答案关于我们前言我们社区陆续会将顾毅(Netflix增长黑客,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。LeetCode算法到目前我们已经更新到105期,我们会保持更新时间和进度(周一、......
  • 「代码随想录算法训练营」第二十三天 | 贪心算法 part1
    455.分发饼干题目链接:https://leetcode.cn/problems/assign-cookies/题目难度:简单文章讲解:https://programmercarl.com/0455.分发饼干.html视频讲解:https://www.bilibili.com/video/BV1MM411b7cq题目状态:初次有贪心算法的总体概念,有点懵思路:先将饼干尺寸大的满足胃口大......
  • LeetCode之vector
    目录前言1.杨辉三角2.删除有序数组的重复项3.只出现一次的数字Ⅲ只出现一次的数字Ⅱ数组中出现次数超过一半的数字补充讲解sort()前言本篇是对vector的一个巩固练习,题目分别在leetcode和牛客网博客主页:酷酷学!!!感谢关注~正文开始1.杨辉三角题目思路......
  • leetcode-9
    题目:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是推导:自己硬写的。代码:1classSolution{2public:3boolisPalindrome(intx){4......
  • LeetCode682
    classSolution{  publicintcalPoints(String[]operations){    int[]a=newint[1000];    intj=0;    intsum=0;    for(inti=0;i<operations.length;i++){        if("+".equals(operations[i])){ ......
  • 代码随想录day13 || 树定义以及遍历
    二叉树定义和种类二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为“左子节点”和“右子节点”。二叉树在计算机科学中有广泛的应用,比如表达式解析、排序算法、搜索算法等。二叉树的定义一个二叉树由一组节点组成,其中每个节点至多有两个子节点,分别称为左子节点和......
  • LeetCode LCR 124.推理二叉树(哈希表 + 建树)
    某二叉树的先序遍历结果记录于整数数组 preorder,它的中序遍历结果记录于整数数组 inorder。请根据 preorder 和 inorder 的提示构造出这棵二叉树并返回其根节点。注意:preorder 和 inorder 中均不含重复数字。示例1:输入:preorder=[3,9,20,15,7],inorder=......
  • leetcode-8,真恶心
    题目:请你来实现一个 myAtoi(strings) 函数,使其能将字符串转换成一个32位有符号整数。推导:代码:1classAutomaton{2public:3intsign=1;//初始化默认符号4longlongans=0;//初始化整数5unordered_map<string,vector<string>>table......