leetcode 279. 完全平方数
题目:279. 完全平方数
给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
方法一:BFS(广度优先搜索)
思路:BFS(广度优先搜索),将小于等于n的所有平方数都视为可扩展搜索的方向,每次扩展将当前数减去该扩展方向的平方数即为扩展后的数。直至扩展到第一个为0的数时,搜索结束。
运行数据:执行用时:25 ms,内存消耗:39.5 MB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| public int numSquares(int n) { int result = 0;
List<Integer> squareNums = new ArrayList<Integer>();
for (int i = 1; i * i <= n; i++) { squareNums.add(i * i); }
boolean[] marks = new boolean[n + 1];
Queue<Integer> queue = new LinkedList<>();
queue.offer(n);
int queneLen = 1;
while (queneLen > 0) {
int currentQueueLen = queneLen;
result++;
while (currentQueueLen-- > 0) {
int currentNum = queue.poll();
queneLen--;
for (Integer squareNum : squareNums) {
int nextNum = currentNum - squareNum;
if (nextNum < 0) { break; }
if (nextNum == 0) { return result; }
if (marks[nextNum]) { continue; }
queue.offer(nextNum);
marks[nextNum] = true;
queneLen++; } } }
return 0; }
|
方法二:动态规划(完全背包)
思路:动态规划(完全背包),将小于等于n的所有平方数都视为不同种类物品的空间,将所求的数视为背包容量,将整个问题转换成求用最少的物品完全装满背包 ,不限制每种物品的数量,即转换为完全背包问题进行解决。
运行数据:执行用时:39 ms,内存消耗:38.9 MB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public int numSquares(int n) { List<Integer> squareNums = new ArrayList<Integer>();
for (int i = 1; i * i <= n; i++) { squareNums.add(i * i); }
int[] f = new int[n + 1];
Arrays.fill(f, Integer.MAX_VALUE); f[0] = 0;
for (Integer squareNum : squareNums) { for (int j = squareNum; j <= n; j++) {
f[j] = Math.min(f[j], f[j - squareNum] + 1); } }
return f[n]; }
|
学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。
才疏学浅,若有错误或不当之处,可批评指正,还请见谅!