LeetCode279——完全平方数

偏执的太偏执、 2022-03-10 07:24 277阅读 0赞

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/perfect-squares/

题目描述:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMjMxOTI2_size_16_color_FFFFFF_t_70

知识点:广度优先搜索、动态规划

思路一:广度优先搜索

深搜用栈,广搜用队列。

时间复杂度是O(n ^ 2)。空间复杂度是O(n)。

JAVA代码:

  1. class Solution {
  2. public int numSquares(int n) {
  3. int result = 1;
  4. Queue<Integer> queue = new LinkedList<>();
  5. queue.add(n);
  6. while (!queue.isEmpty()) {
  7. int size = queue.size();
  8. for (int i = 0; i < size; i++) {
  9. int now = queue.poll();
  10. for (int j = 1; j * j <= now; j++) {
  11. if (now - j * j == 0) {
  12. return result;
  13. }
  14. queue.add(now - j * j);
  15. }
  16. }
  17. result++;
  18. }
  19. return -1;
  20. }
  21. }

LeetCode解题报告:

20190310095925963.jpg

思路二:动态规划

仔细分析思路一中的广搜算法:12可以由11加上1,或者是8加上4,或者是3加上9得到。

对于11可以由10加上1,或者是7加上4,或者是2加上9得到。

对于8可以由7加上1,或者是4加上4得到。

……如果更进一步分析下去,我们需要分析两次上述的7,这其实是一种重复计算,因此我们采用动态规划来进行优化。

状态定义

f(x) ———— 数字总和为x的最少完全平方数个数

状态转移

f(x) = min(f(x), 1 + f(y)), y∈[0, x - 1],且x - y是一个完全平方数

时间复杂度是O(n ^ 1.5)。空间复杂度是O(n)。

JAVA代码:

  1. class Solution {
  2. public int numSquares(int n) {
  3. int[] dp = new int[n + 1];
  4. for (int i = 0; i < dp.length; i++) {
  5. dp[i] = i;
  6. }
  7. for (int i = 2; i < dp.length; i++) {
  8. for (int j = 1; i - j * j >= 0 ; j++) {
  9. dp[i] = Math.min(dp[i], 1 + dp[i - j * j]);
  10. }
  11. }
  12. return dp[n];
  13. }
  14. }

LeetCode解题报告:

20190310100417350.jpg

发表评论

表情:
评论列表 (有 0 条评论,277人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode279 完全平方

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12

    相关 279. 完全平方

    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 给你一个整数 n ,返回和为 n