zoukankan      html  css  js  c++  java
  • [LeetCode] 279. Perfect Squares

    Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

    Example 1:

    Input: n = 12
    Output: 3 
    Explanation: 12 = 4 + 4 + 4.

    Example 2:

    Input: n = 13
    Output: 2
    Explanation: 13 = 4 + 9.

    完全平方数。题意是给一个数字N,请你返回最少的需要几个完全平方数的加和的个数。比如第一个例子,12是由三个4组成,4也是完全平方数。

    思路是动态规划。首先说一下暴力解,这个题的暴力解是从1到N一个个看是否是完全平方数,如果N是某个数的平方,那么结果自然等于2;如果N不是某个数的平方,那么可以试着从1开始,用N减去每个数的平方,看看需要几个完全平方数才能得到N。举个例子,比如找15好了,第一个完全平方数是1,需要15个1;第二个完全平方数是4,需要3个4 + 3个1。

    其实动态规划的思路是从暴力解延伸出来的,只是我们用了一个额外的数组记录了之前的结果。首先创建一个长度为N + 1的数组记录DP的结果,并且DP[0] = 1。从i= 1开始,一直遍历到N。当遇到一个新的数字N的时候,需要再次从1开始遍历,看看当前的这个数字i是否整体或者部分能被某一个更小的数的平方代替。比如遍历到7的时候,我们发现7是可以被一个2的平方和三个1的平方代替的,所以DP的转移方程是

    dp[i] = Math.min(dp[i], dp[i - j * j] + 1);

    这里j的范围是[1, i)

    最后返回的是dp[n]

    时间O(n * sqrt(n))

    空间O(n)

    Java实现

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

    JavaScript实现

     1 /**
     2  * @param {number} n
     3  * @return {number}
     4  */
     5 var numSquares = function (n) {
     6     let dp = new Array(n + 1).fill(0);
     7     for (let i = 0; i <= n; i++) {
     8         dp[i] = i;
     9         for (let j = 1; j * j <= i; j++) {
    10             dp[i] = Math.min(dp[i], dp[i - j * j] + 1);
    11         }
    12     }
    13     return dp[n];
    14 };

    LeetCode 题目总结

  • 相关阅读:
    Android应用中使用自定义文字
    Linux下diff使用简介
    Android扫描SD卡中的文件
    onActivityResult不起作用?可能是和你的launchMode有关!
    修改SlidingMenu,使其能够完美运行
    eclipse快捷键说明
    XP下Virtualbox虚拟Ubuntu共享文件夹设置
    记一次调用RefreshObjectCaches刷新节点上的文件内容
    idea快捷键之遍历
    word转pdf
  • 原文地址:https://www.cnblogs.com/cnoodle/p/13200933.html
Copyright © 2011-2022 走看看