Files
obsidian/АиСД/Задачи/LeetCode/Perfect Squares.md
T
roma-dxunvrs c90a404c40
deploy / Pull and Restart (push) Successful in 18s
Refactor
2026-09-19 19:20:43 +03:00

19 lines
1.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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];
}
}
```