zoukankan      html  css  js  c++  java
  • 完全平方数

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

    示例 1:

    输入: n = 12
    输出: 3
    解释: 12 = 4 + 4 + 4.
    示例 2:

    输入: n = 13
    输出: 2
    解释: 13 = 4 + 9.

    方法1:深度优先(BFS)

     1 public class T279 {
     2     public int numSquares(int n) {
     3         List<Integer> squareList = getSquareArray(n);
     4         Queue<Integer> que = new LinkedList<>();
     5         que.add(n);
     6         boolean[] visited = new boolean[n];
     7         int level = 0;
     8         while (!que.isEmpty()) {
     9             int size = que.size();
    10             level++;
    11             while (size-- > 0) {
    12                 int num = que.poll();
    13                 for (int square : squareList) {
    14                     int left = num - square;
    15                     if (left == 0) {
    16                         return level;
    17                     }
    18                     if (left < 0) {
    19                         break;
    20                     }
    21                     if (visited[left]) {
    22                         continue;
    23                     }
    24                     visited[left] = true;
    25                     que.add(left);
    26                 }
    27 
    28             }
    29         }
    30         return level;
    31     }
    32 
    33     private ArrayList<Integer> getSquareArray(int n) {
    34         ArrayList<Integer> list = new ArrayList<>();
    35         for (int i = 1; i <= n; i++) {
    36             int num = i * i;
    37             if (num <= n) {
    38                 list.add(num);
    39             } else {
    40                 break;
    41             }
    42         }
    43         return list;
    44     }
    45 }

     方法二:dp

     1 public class T279 {
     2     public int numSquares(int n) {
     3         List<Integer> squareList = getSquareArray(n);
     4         int[] dp = new int[n + 1];
     5         for (int i = 1; i <= n; i++) {
     6             int min = Integer.MAX_VALUE;
     7             for (int num : squareList) {
     8                 if (num <= i) {
     9                     min = Math.min(dp[i - num] + 1, min);
    10                 }
    11             }
    12             dp[i] = min;
    13         }
    14         return dp[n];
    15     }
    16 
    17     private ArrayList<Integer> getSquareArray(int n) {
    18         ArrayList<Integer> list = new ArrayList<>();
    19         for (int i = 1; i <= n; i++) {
    20             int num = i * i;
    21             if (num <= n) {
    22                 list.add(num);
    23             } else {
    24                 break;
    25             }
    26         }
    27         return list;
    28     }
    29 }
    一回生,二回熟
  • 相关阅读:
    HTTP解析
    Java设计模式8:迭代器模式
    Java设计模式7:适配器模式
    Sharepoint 开启发布功能的PowerShell
    How to Limit NodeRunner.exe High Memory, CPU Usage
    sharepoint 2013 网站集解锁
    SharePoint Set-SPUser 命令拒绝访问
    SharePoint 列表视图修改多行文本字段显示长度
    SharePoint 修改项目的new图标显示天数
    SharePoint 压缩打包文件代码分享
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12446682.html
Copyright © 2011-2022 走看看