美文网首页
Leetcode 精选之分割整数(完全平方数)

Leetcode 精选之分割整数(完全平方数)

作者: Kevin_小飞象 | 来源:发表于2020-04-09 18:55 被阅读0次

    题目描述

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

    示例 1:

    输入: n = 12
    输出: 3
    解释: 12 = 4 + 4 + 4.
    示例 2:

    输入: n = 13
    输出: 2
    解释: 13 = 4 + 9.

    题目链接:力扣

    解题思路

    class Solution {
        public int numSquares(int n) {
            List<Integer> squares = generateSquares(n);
            Queue<Integer> queue = new LinkedList<>();
            boolean[] marked = new boolean[n + 1];
            queue.add(n);
            marked[n] = true;
            int level = 0;
            while (!queue.isEmpty()) {
                int size = queue.size();
                level++;
                while (size-- > 0) {
                    int cur = queue.poll();
                    for (int s : squares) {
                        int next = cur - s;
                        if (next < 0) {
                            break;
                        }
                        if (next == 0) {
                            return level;
                        }
                        if (marked[next]) {
                            continue;
                        }
                        marked[next] = true;
                        queue.add(next);
                    }
                }
            }
            return n;
        }
    
        /**
        * 生成小于 n 的平方数序列
        * @return 1,4,9,...
        */
        private List<Integer> generateSquares(int n) {
            List<Integer> squares = new ArrayList<>();
            int square = 1;
            int diff = 3;
            while (square <= n) {
                squares.add(square);
                square += diff;
                diff += 2;
            }
            return squares;
        }
    }
    

    测试结果

    image.png

    相关文章

      网友评论

          本文标题:Leetcode 精选之分割整数(完全平方数)

          本文链接:https://www.haomeiwen.com/subject/gvkhmhtx.html