279 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.

Example:

Input: n = 12
Output: 3
Explanation: 12 = 4 + 4 + 4.

Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.

解釋下題目:

給定一個(gè)正整數(shù),求出這個(gè)數(shù)能夠被分成多少個(gè)平方數(shù)加起來的和,求出最少平方數(shù)的個(gè)數(shù)

1. 動(dòng)態(tài)規(guī)劃

實(shí)際耗時(shí):18ms

public int numSquares(int n) {
    if (n < 1) {
        //error input
        return -1;
    }
    if (n == 1 || n == 2 || n == 3) {
        return n;
    }
    if (n == 4) {
        return 1;
    }

    //special situation is done
    //for easy, dp[1] means the number of 1,not 2.
    int[] dp = new int[n + 1];
    dp[0] = 0;  //very important
    dp[1] = 1;  //1 = 1
    dp[2] = 2;  //2 = 1+1
    dp[3] = 3;  //3 = 1+1+1
    dp[4] = 1;  //4 = 4
    for (int i = 5; i <= n; i++) {
        //any integer can use 1+1+1+1.....to compose
        int min = i;
        for (int j = 1; ; j++) {
            if (j * j > i) {
                break;
            }
            min = Math.min(min, dp[i - j * j] + 1);
        }
        dp[i] = min;
    }
    return dp[n];
}
踩過的坑:9

??一開始我想的是貪心算法,給定一個(gè)數(shù),找到比它小的最大的平方數(shù),然后剩下的那個(gè)繼續(xù)這么做,直到最后收斂到1,2,3,4這種小的數(shù)字上,然而事實(shí)上,12就是一個(gè)反例,比12最小的平方數(shù)是9,然后剩下3,顯然3和9不是最優(yōu)解,因?yàn)樗麄冃枰?個(gè)數(shù)字(1+1+1+9),而(4+4+4)只需要三個(gè)數(shù)字。后來就往DP上面靠,發(fā)現(xiàn)12可以通過1,4,9這三個(gè)數(shù)字加點(diǎn)什么得到,而1,4,9都是一個(gè)數(shù)字,不一定是最大的是最優(yōu)的(這道題只滿足局部最優(yōu)解)

時(shí)間復(fù)雜度O(nlogn)
空間復(fù)雜度O(n)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容