zoukankan      html  css  js  c++  java
  • *Perfect Squares & DP 自底向上 & 自顶向下

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

    For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

    Credits:
    Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

    解法一:自底向上

    dp[n] indicates that the perfect squares count of the given n, and we have:

    dp[0] = 0 
    dp[1] = dp[0]+1 = 1
    dp[2] = dp[1]+1 = 2
    dp[3] = dp[2]+1 = 3
    dp[4] = Min{ dp[4-1*1]+1, dp[4-2*2]+1 } 
          = Min{ dp[3]+1, dp[0]+1 } 
          = 1                
    dp[5] = Min{ dp[5-1*1]+1, dp[5-2*2]+1 } 
          = Min{ dp[4]+1, dp[1]+1 } 
          = 2
                            .
                            .
                            .
    dp[13] = Min{ dp[13-1*1]+1, dp[13-2*2]+1, dp[13-3*3]+1 } 
           = Min{ dp[12]+1, dp[9]+1, dp[4]+1 } 
           = 2
                            .
                            .
                            .
    dp[n] = Min{ dp[n - i*i] + 1 },  n - i*i >=0 && i >= 1
    public int numSquares(int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for(int i = 1; i <= n; ++i) {
            int min = Integer.MAX_VALUE;
            int j = 1;
            while(i - j*j >= 0) {
                min = Math.min(min, dp[i - j*j] + 1);
                ++j;
            }
            dp[i] = min;
        }        
        return dp[n];
    }

    reference:

    https://discuss.leetcode.com/topic/26400/an-easy-understanding-dp-solution-in-java/2

    解法二:自顶向下

    public class Solution {
        public int[] dp;
        public int numSquares(int n) {
            dp = new int[n+1];
            Arrays.fill(dp, -1);
            dp[0] = 0;
            return squaresHelper(n);   
        }
        
        public int squaresHelper(int m){
            int j = 1;
            int min = Integer.MAX_VALUE; 
            while(j*j<=m)
            {
                if(j*j==m) return 1;
                if(dp[m-j*j]==-1)
                {
                    dp[m-j*j] = squaresHelper(m-j*j);
                }
                min = Math.min(min,dp[m-j*j]+1);
                j++;
            }
            dp[m]=min;
            return dp[m];
        }
        
    }

    解法三:faster 的DP

    https://discuss.leetcode.com/topic/24255/summary-of-4-different-solutions-bfs-dp-static-dp-and-mathematics/25

    public class Solution {
        static List<Integer> result = new ArrayList<>();
        public int numSquares(int n) {
            if (result.size() == 0) {
                result.add(0);
            }
            while (result.size() <= n) {
                int m = result.size();
                int tempMin = Integer.MAX_VALUE;
                for (int j = 1; j * j <= m; j++) {
                    tempMin = Math.min(tempMin, result.get(m - j * j) + 1);
                }
                result.add(tempMin);
            }
            return result.get(n);
        }
    }

     static生成了class variable,leetcode执行多次test case,只生成了一次result 这个object。

  • 相关阅读:
    c++标准库cstring文件
    c++标准库string文件
    c++标准库cmath文件
    micro:bit用蜂鸣器制作计时器
    【Python入门自学笔记专辑】——PythonUnicode字符
    eclips安装教程
    题目(18)答案
    Console.Write格式化输出
    图像传输有用到,图像与数据流相互转换
    datalist、repearter、gridview显示行号的三种方法 或者是获取datalist行id
  • 原文地址:https://www.cnblogs.com/hygeia/p/5751641.html
Copyright © 2011-2022 走看看