1. 程式人生 > 實用技巧 >279. 完全平方數

279. 完全平方數

給定正整數n,找到若干個完全平方數(比如1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

示例1:

輸入: n = 12
輸出: 3 
解釋: 12 = 4 + 4 + 4.

示例 2:

輸入: n = 13
輸出: 2
解釋: 13 = 4 + 9.

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/perfect-squares


思路:

這題之前用BFS的方法解決過,之前也說過,在DP演算法中還會遇到

DP演算法,還是要總結找歸類的,如果就自己去找,去發現的話還挺困難的

從官方偷的圖,先要找到在這個數之前的平方數有哪些,基本上的規律就是

比如圖中的找4的最少個數的時候,要和dp【4 - 4】 + 1比,那麼4為什麼要減4

5這個再找的時候為什麼也是減去了4,那如果是9呢?

9要減去1 或者 4 ,或者 9 當然除去一些不合法的

ok,那規律就是,減去小於等於他的平方數

class Solution {

  public int numSquares(int n) {
    //dp陣列的長度為n + 1
        int dp[] = new int[n + 1];
        //將dp陣列第一個元素設定為0,其餘的都充以最大元素
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[
0] = 0; //這裡找到比n小的所有的平方數 int maxIndex = (int) Math.sqrt(n) + 1; int square_nums[] = new int[maxIndex]; for (int i = 1; i < maxIndex; ++i) { square_nums[i] = i * i; } //這裡就遍歷比較,後面得出來的值都建立在前面的值的基礎上 for (int i = 1; i <= n; ++i) {
for (int s = 1; s < maxIndex; ++s) { if (i < square_nums[s]) break; dp[i] = Math.min(dp[i], dp[i - square_nums[s]] + 1); } } return dp[n]; } }