diff --git a/279.perfect-squares.js b/279.perfect-squares.js deleted file mode 100644 index cdc993c82b30b81420559ac2098c1655f15a0e5c..0000000000000000000000000000000000000000 --- a/279.perfect-squares.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * @lc app=leetcode id=279 lang=javascript - * - * [279] Perfect Squares - * - * https://leetcode.com/problems/perfect-squares/description/ - * - * algorithms - * Medium (40.98%) - * Total Accepted: 168.2K - * Total Submissions: 408.5K - * Testcase Example: '12' - * - * 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. - */ -/** - * @param {number} n - * @return {number} - */ -var numSquares = function(n) { - -}; - diff --git a/279.perfect-squares.md b/279.perfect-squares.md new file mode 100644 index 0000000000000000000000000000000000000000..22409f7a009a0daed21b1603be185b503e82f72f --- /dev/null +++ b/279.perfect-squares.md @@ -0,0 +1,104 @@ +## 题目地址 +https://leetcode.com/problems/perfect-squares/description/ + +## 题目描述 + + +``` +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. + +``` + +## 思路 + +直接递归处理即可,但是这种暴力的解法很容易超时。如果你把递归的过程化成一棵树的话(其实就是递归树), +可以看出中间有很多重复的计算。 + +如果能将重复的计算缓存下来,说不定能够解决时间复杂度太高的问题。 + +> 递归对内存的要求也很高, 如果数字非常大,也会面临爆栈的风险,将递归转化为循环可以解决。 + +如果使用DP,其实本质上和递归 + 缓存 差不多。 + +## 关键点解析 + +- 如果用递归 + 缓存, 缓存的设计很重要 +我的做法是key就是n,value是以n为起点,到达底端的深度。 +下次取出缓存的时候用当前的level + 存的深度 就是我们想要的level. + +## 代码 + +```js +/* + * @lc app=leetcode id=279 lang=javascript + * + * [279] Perfect Squares + * + * https://leetcode.com/problems/perfect-squares/description/ + * + * algorithms + * Medium (40.98%) + * Total Accepted: 168.2K + * Total Submissions: 408.5K + * Testcase Example: '12' + * + * 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. + */ + +const mapper = {}; + +function d(n, level) { + + if (n === 0) return level; + + let i = 1; + const arr = []; + + while(n - i * i >= 0) { + const hit = mapper[n - i * i]; + if (hit) { + arr.push(hit + level); + } else { + const depth = d(n - i * i, level + 1) - level; + mapper[n - i * i] = depth; + arr.push(depth + level); + } + i++; + } + + return Math.min(...arr); +} +/** + * @param {number} n + * @return {number} + */ +var numSquares = function(n) { + return d(n, 0); +}; +``` diff --git a/README.md b/README.md index 7e101094519c7eb8fc2441bcda6b76b97fa85123..5bb62440f333e2faba7044c327af8d3994eb6ba2 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ leetcode题解,记录自己的leecode解题之路。 - [328.odd-even-linked-list](./328.odd-even-linked-list.md) - [445.add-two-numbers-ii](./445.add-two-numbers-ii.md) - [877.stone-game](./877.stone-game.md) +- [279.perfect-squares](./279.perfect-squares.md) ### 困难难度 - [145.binary-tree-postorder-traversal](./145.binary-tree-postorder-traversal.md)