279. 完全平方數
阿新 • • 發佈:2020-08-01
給定正整數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]; } }