zoukankan      html  css  js  c++  java
  • [LeetCode]Perfect Squares

    题目链接:Perfect Squares

    题目内容:

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

    For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.


    题目解法:

    最初看到这个题,我想到的是回溯法,剪了半天的枝还是各种超时,后来参考了xudli的解法,才知道这道题用动态规划更合适。

    我们设d[i]=a表示数字i对应的least number of perfect square numbers为a,则显然d[1]=1为初始条件,接着我们用背包问题的思想,对于i从2到n,尝试向其中放入perfect square number j,j从1开始枚举,每次放入后得到的结果为d[i - j*j]+1,也就是在不放入j的least number基础上+1得到d[i]的最小值,对于不同的j,我们应该选取其中最小的那个,也就是说:d[i] = min{d[i-j*j],j=1,2,3...,j*j<=i}。

    最后,d[n]就是结果。

    代码如下:

    class Solution {
    public:
        int getMin(int a, int b){
            return a < b ? a : b;
        }
        int numSquares(int n) {
            int *d = new int[n+1];
            d[1] = 1; // d[i]表示数字i的Prefect Seuares值。
            for(int i = 2; i <= n; i++){
                int j = 1;
                int min = 99999999;
                while(j*j <= i){
                    if(j*j == i){
                        min = 1;
                        break;
                    }
                    min = getMin(min,d[i-j*j] + 1);
                    j++;
                }
                d[i] = min;
            }
            return d[n];
        }
    };


  • 相关阅读:
    vfork与fork的区别
    常见的六种设计模式以及应用场景
    Java中常见的集合类比较
    排序——总结
    排序——交换排序
    排序——选择排序
    排序——归并排序
    排序——基数排序
    排序——插入排序
    设计模式
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154018.html
Copyright © 2011-2022 走看看