zoukankan      html  css  js  c++  java
  • 【Leetcode】279.perfect-squares

    题目地址

    https://leetcode.com/problems/perfect-squares/

    题目大意

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

    解题思路

    动态规划思想,dp[i]表示i的问题解, 对i开方,得到最大的平方根maxRoot, 则i的某个平方和可表示为:
    i = (j_1^2) +(j_2^2) + ...+ (j_k^2)
    = (j_m^2) + ((j_1^2) + ... + (j_{m-1}^2) + (j_{m+1}^2) + ... + (j_k^2))
    = x + dp[i-x]
    其中,k <= i, 0 < (j_k), x <= maxRoot, 故而
    dp[i] = 1 + min(dp[i- (1^2)], dp[i-(2^2)],...,dp[i-({maxRoot}^2)]), 为方便计算,令dp[0] = 0

    c++代码

    class Solution {
    public:
        int numSquares(int n) {
           vector<int> dp(n+1, 0);
           int cnt = 0;
            for (int i = 1; i <= n; i++) {
               int maxRoot = sqrt(i);
               int minCnt = i;
               while (maxRoot) {
                   minCnt = min(minCnt, dp[i - maxRoot * maxRoot]);
                   maxRoot--;
               }
               dp[i] = 1 + minCnt; 
            }
    
            return dp[n];
        }
    };
    

    go代码

    func numSquares(n int) int {
        var dp = make([]int, n + 1)
    	for i := 1; i <= n ; i++{
    		maxRoot := int(math.Sqrt(float64(i)))
    		minCnt := i
    		for ;maxRoot > 0;maxRoot-- {
    			minCnt = int(math.Min(float64(minCnt), float64(dp[i - maxRoot * maxRoot])))
    		}
    		dp[i] = 1 + minCnt
    	}
    
    	return dp[n]
    }
    

    扩展

    求出平方和展开式?
    func numSquares2(n int) (int, []int) {
    	var dp = make([]int, n + 1)
    	var numCombGroup = [][]int{{}}
    	for i := 1; i <= n ; i++{
    		maxRoot := int(math.Sqrt(float64(i)))
    		minCnt := i
    		remainNum := 0
    		for ;maxRoot > 0;maxRoot-- {
    			if minCnt > dp[i - maxRoot * maxRoot] {
    				minCnt = dp[i - maxRoot * maxRoot]
    				remainNum = i - maxRoot * maxRoot
    			}
    			minCnt = int(math.Min(float64(minCnt), float64(dp[i - maxRoot * maxRoot])))
    		}
    		dp[i] = 1 + minCnt
    		numComb := []int{i - remainNum}
    		numComb = append(numComb, numCombGroup[remainNum]...)
    		numCombGroup = append(numCombGroup,numComb)
    	}
    
    	return dp[n], numCombGroup[n]
    }
    
  • 相关阅读:
    跳跃表原理
    ThreadLocal
    Innodb中的事务隔离级别和锁的关系
    线程池拒绝策略
    vue 的 nextTick 原理
    Git 的基本操作
    JavaScript 的运行机制
    实现一个react系列三:生命周期
    实现一个react系列二:渲染组件
    实现一个react系列一:JSX和虚拟DOM
  • 原文地址:https://www.cnblogs.com/AndrewGhost/p/12222331.html
Copyright © 2011-2022 走看看