英文原文
Given an integer n, return the least number of perfect square numbers that sum to n.
A perfect square is an integer that is the square of an integer; in other words, it is the product of some integer with itself. For example, 1, 4, 9, and 16 are perfect squares while 3 and 11 are not.
Example 1:
Input: n = 12 Output: 3 Explanation: 12 = 4 + 4 + 4.
Example 2:
Input: n = 13 Output: 2 Explanation: 13 = 4 + 9.
Constraints:
1 <= n <= 104
中文题目
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。
示例 1:
输入:n =12输出:3 解释:12 = 4 + 4 + 4
示例 2:
输入:n =13输出:2 解释:13 = 4 + 9
提示:
1 <= n <= 104
通过代码
高赞题解
解题方案
思路:
- 标签:动态规划
- 首先初始化长度为
n+1的数组dp,每个位置都为0 - 如果
n为0,则结果为0 - 对数组进行遍历,下标为
i,每次都将当前数字先更新为最大的结果,即dp[i]=i,比如i=4,最坏结果为4=1+1+1+1即为4个数字 - 动态转移方程为:
dp[i] = MIN(dp[i], dp[i - j * j] + 1),i表示当前数字,j*j表示平方数 - 时间复杂度:$O(n*sqrt(n))$,sqrt 为平方根
[]class Solution { public int numSquares(int n) { int[] dp = new int[n + 1]; // 默认初始化值都为0 for (int i = 1; i <= n; i++) { dp[i] = i; // 最坏的情况就是每次+1 for (int j = 1; i - j * j >= 0; j++) { dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程 } } return dp[n]; } }
[]/** * @param {number} n * @return {number} */ var numSquares = function(n) { const dp = [...Array(n+1)].map(_=>0); // 数组长度为n+1,值均为0 for (let i = 1; i <= n; i++) { dp[i] = i; // 最坏的情况就是每次+1 for (let j = 1; i - j * j >= 0; j++) { dp[i] = Math.min(dp[i], dp[i - j * j] + 1); // 动态转移方程 } } return dp[n]; };
画解:
<
,
,
,
,
,
,
,
,
,
,
,
,
>
想看大鹏画解更多高频面试题,欢迎阅读大鹏的 LeetBook:《画解剑指 Offer 》,O(∩_∩)O
统计信息
| 通过次数 | 提交次数 | AC比率 |
|---|---|---|
| 218369 | 344028 | 63.5% |
提交历史
| 提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
|---|
相似题目
| 题目 | 难度 |
|---|---|
| 计数质数 | 中等 |
| 丑数 II | 中等 |