Leetcode 279 完全平方数

题意理解

        给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

        完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

        从题目中可以理解: 元素是平方数,即1,4,9,...

        元素可以使用无数次。

        而整数n表示要使用平方数凑数来的目标。

        则该问题是一个完全背包问题。

        又因为,这里求凑出target的最少完全平方数,所以这里不是一个纯背包问题。

        又因为,1+4+4 和4+1+4都是用了三个平方数,所以顺序是无关的,排列数和组合数都可以解决这个问题,即双for循环可以颠倒。

        此外,如何遍历完全平方数呢?

        我们可以采用for(int i=0;i<\sqrt{n};i++)   完全平方数=i×i的方式来遍历。

        因为要使用i×i来凑n,所以i一定<=\sqrt{n}

解题思路

         此题是一道完全背包问题,但是是非纯背包问题。因为这里求的是最少用几个元素,而不是最大价值。

        这里的元素是i^2,其中i是[1,\sqrt{n}]的整数

        目标值是target=n

        元素可以无数次取用。

1.解题

public int numSquares(int n) {
        int dp[]=new int[n+1];
        Arrays.fill(dp,Integer.MAX_VALUE);
        dp[0]=0;
        for(int i=1;i<=Math.sqrt(n);i++){//遍历元素
            for(int j=1;j<=n;j++){
                if(Math.pow(i,2)<=j&&Integer.compare(Integer.MAX_VALUE,dp[j-(int)Math.pow(i,2)])!=0){
                    dp[j]=Math.min(dp[j],dp[j-(int)Math.pow(i,2)]+1);
                }
            }
        }
        return Integer.compare(Integer.MAX_VALUE,dp[n])!=0?dp[n]:-1;
    }

2.分析

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

空间复杂度:O(n)

你可能感兴趣的:(刷题训练营,leetcode,算法,数据结构)