zoukankan      html  css  js  c++  java
  • 完全平方数-leetcode279题

    动态规划:

    标签:动态规划
    首先初始化长度为n+1的数组dp,每个位置都为0
    如果n为0,则结果为0
    对数组进行遍历,下标为i,每次都将当前数字先更新为最大的结果,即dp[i]=i,比如i=4,最坏结果为4=1+1+1+1即为4个数字
    动态转移方程为:dp[i] = MIN(dp[i], dp[i - j * j] + 1),i表示当前数字,j*j表示平方数
    时间复杂度:O(n*sqrt(n)),sqrt为平方根
    作者:guanpengchn
    链接:https://leetcode-cn.com/problems/perfect-squares/solution/hua-jie-suan-fa-279-wan-quan-ping-fang-shu-by-guan/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    个人理解:首先比较要分解的数M中是否包含平方数,因此用i-j*j来判断所分解的数包含几个相应的平方数。然后将要M分解成M=1+N的形式,比较dp[N]+1与dp[M]的大小关系,取二者较小值重新赋给dp[M]。在进行j的循环直到不满足条件为止。

    例如:dp[4]第一次循环,i=4,j=1之后的结果为,dp[4]=minnum(dp[4],dp[3]+1);此时dp[4]=4(由前式推得dp[3]满足条件的情况为3=1+1+1,所以dp[3]=3);

    然后,在进入j的循环中此时j=2;运行结果为,dp[4]=minnum(dp[4],dp[0]+1);此时dp[4]=1;

    之后,进入j循环j=3,i-j*j>= 0不满足条件,所以跳出,执行下一组。求dp[5]

    程序:

    %%比较两个数的大小取小值

    int min_num(int a,int b)
    {
        if(a>b)
        {
            return b;
        }
        else
        {
            return a;
        }
    }
    %%进行完全平方和分解
    int numSquares(int n)
    {
        int* dp = (int*)malloc((n + 1) * sizeof(int));
        for (int i = 0; i <= n; i++) {
            dp[i] = i;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; i - j * j >= 0; j++) {
                dp[i] = min_num(dp[i], dp[i - j * j] + 1);
            }
        }
        return dp[n];
    }
    本文为自己参考别人程序写的动态规划程序,存在很多不足,希望有好的点子的各位能够给予意见和建议

  • 相关阅读:
    mysql 递归查找菜单节点的所有子节点
    mapStruct笔记
    JavaBean映射工具dozer学习
    常见Bean映射工具分析评测及Orika介绍
    Java 实体-实体的映射框架
    实体类与实体DTO类之间的转换
    推荐一个 Java 实体映射工具 MapStruct
    java Web项目Service层通用接口和entityVo对象与entity对象转化问题的解决方案
    SpringData JPA进阶查询—JPQL/原生SQL查询、分页处理、部分字段映射查询
    JPA框架下使用纯粹的原生SQL
  • 原文地址:https://www.cnblogs.com/sbb-first-blog/p/13174064.html
Copyright © 2011-2022 走看看