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 }
    一回生,二回熟
  • 相关阅读:
    几种asp.net页面缓存的做法
    [转载]如果你也想做一个Pinterest网站
    Oracle支持的字符函数和它们的Microsoft SQL Server等价函数
    使用OLEDB读取不同版本Excel数据的连接字符串设置
    SQLServer和Oracle的常用函数对比
    [转载] 简易Pinterest/瀑布流布局
    C# WinForm 实现控件可拖拽
    【转载】Highcharts使用指南
    RBAC开发技术
    一个比较好的winform内嵌excel插件
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12446682.html
Copyright © 2011-2022 走看看