19 lines
1.1 KiB
Markdown
19 lines
1.1 KiB
Markdown
Leetcode #279 | #Medium | [[1-D Динамика]]
|
||
## Идея
|
||
Динамика... Заводим dp на i+1 элемент, сначала заполняем худшим случаем - `dp[i]=i` - для i-го числа сойдет сумма из i единиц. Дальше идем от 1 до конца. На каждом шаге начинаем перебирать от j=1 так что j\*j <= i. `dp[i] = min(dp[i], 1+dp[i-j*j]). В чем тут логика. Мы нашли новый квадрат, отнимаем его от числа и получили то, что уже посчитали ранее, прибавляем 1 так как использовали еще один, ну и делаем минимум с текущим результатом.
|
||
## Big-O
|
||
- Время ```O(Nsqrt(N))```
|
||
- Память ```O(N)```
|
||
## Код
|
||
```Java
|
||
class Solution {
|
||
public int numSquares(int n) {
|
||
int[] dp = new int[n + 1];
|
||
for (int i = 1; i <= n; i++) {
|
||
dp[i] = i;
|
||
for (int j = 1; j * j <= i; j++) dp[i] = Math.min(dp[i], 1 + dp[i - j * j]);
|
||
}
|
||
return dp[n];
|
||
}
|
||
}
|
||
``` |