栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【LeetCode】Day69-完全平方数&整数拆分&组合总和 Ⅳ

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【LeetCode】Day69-完全平方数&整数拆分&组合总和 Ⅳ

完全平方数

279. 完全平方数【中等】

题解

和昨天的322. 零钱兑换对比一下

发现几乎完全一样,只是多了一步计算完全平方数,代码完全可以照搬

class Solution {
    private int[] square;
    public int numSquares(int n) {
        //生成完全平方数数组
        int slen=(int)Math.sqrt(n);
        square=new int[slen];
        judgeSquares(n);
        
        int[] dp=new int[n+1];
        Arrays.fill(dp,n+1);
        dp[0]=0;
        for(int i=1;i<=n;i++){
            for(int j=0;j
                if(i>=square[j])
                    dp[i]=Math.min(dp[i],dp[i-square[j]]+1);
            }
        }
        return dp[n];
    }
    //筛选出完全平方数
    public void judgeSquares(int n){
        for(int i=0;i<(int)Math.sqrt(n);i++){
            square[i]=(i+1)*(i+1);
        }
    }
}

简化一下代码,发现其实完全平方数数组并不需要,用 j ∗ j ( 0 < j < = n ) j*j (0

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

顺便说一下,乘法比开方的效率高,因此最好用 j*j

时间复杂度: O ( n n ) O(nsqrt{n}) O(nn ​)

空间复杂度: O ( n ) O(n) O(n)

整数拆分

343. 整数拆分【中等】

题解
  1. 状态定义:dp[i] 表示将正整数 i 拆分成至少两个正整数的和之后,这些正整数的最大乘积
  2. 状态转移方程:假设对正整数 i 拆分出的第一个正整数是 j(1≤j (1)i-j不拆了:乘积为 j ∗ ( i − j ) j*(i-j) j∗(i−j)
    (2)i-j继续拆:乘积为 j ∗ d p [ i − j ] j*dp[i-j] j∗dp[i−j]
    所以dp[i]=Math.max( i*(i-j) , i*dp[i-j] )
  3. 初始条件:dp[0]=dp[1]=0,因为0和1无法拆分成两个正整数
  4. 返回值:dp[n]
class Solution {
    public int integerBreak(int n) {
        int[] dp=new int[n+1];
        for(int i=2;i<=n;i++){
            for(int j=1;j
                int tmp=Math.max(j*(i-j),j*dp[i-j]);
                dp[i]=Math.max(tmp,dp[i]);
            }
        }
        return dp[n];
    }
}

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( n ) O(n) O(n)

组合总和 Ⅳ

377. 组合总和 Ⅳ【中等】

题解

和 518. 零钱兑换 II 简直一模一样…不知道说啥了,直接默认代码就得了

class Solution {
    public int combinationSum4(int[] nums, int target) {
        int[] dp=new int[target+1];
        dp[0]=1;
        for(int i=1;i<=target;i++){
            for(int j=0;j
                if(i>=nums[j])
                    dp[i]+=dp[i-nums[j]];
            }
        }
        return dp[target];
    }
}

时间复杂度: O ( n 2 ) O(n^2) O(n2)

空间复杂度: O ( n ) O(n) O(n)

总结

题解中有个大佬总结了类似的背包问题的模板,希望用一种规律搞定背包问题,太牛了,非常精辟!学习!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号