搜索(BFS)---完美平方数

完美平方数

279. Perfect Squares (Medium)

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

题目描述:

  给出一个正整数,求出它最少可以由几个平方数组成。

思路分析:

  可以将每个整数看成图中的一个节点,如果两个整数之差为一个平方数,那么这两个整数所在的节点就有一条边。

要求解最小的平方数数量,就是求解从节点 n 到节点 0 的最短路径。

代码:

public int numSquares(int n){
    List<Integer>squares=generate(n); //生成n以内的所有平方数
    Queue<Integer>q=new LinkedList<>();
    int res=0;
    q.offer(n);
    boolean[]flag=new boolean[n+1];
    flag[n]=true;
    while(!q.isEmpty()){
        int size=q.size();
        res++; //每循环一次个数就加一
        while(size-->0){
            int cur=q.poll();
            for(int s:squares){ //到下一个点的途径
                int next=cur-s;
                if(next<0)
                    break;
                if(next==0)
                    return res;
                if(flag[next]==true)//已经访问过的点
                    continue;
                flag[next]=true;
                q.offer(next);
            }
        }
    }
    return n;
}
public List<Integer>generate(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;
}
原文地址:https://www.cnblogs.com/yjxyy/p/11109571.html