leetcode279 Perfect Squares(完全平方数)

题目链接:https://leetcode.com/problems/perfect-squares/description/
知识点:
图论问题,最短路径,队列实现广度优先算法
思路:
这题运用贪心的思想是行不通的。举出一个反例如下:
标准解:
12 = 4 + 4 + 4.
贪心解:
12=9 + 1 + 1 + 1.
显然贪心求出来的组成和的完全平方数的个数比最优情况下要多。

所以采用转化为图论问题来求解,从n到0,每个数字表示一个节点;如果两个数字x到y相差一个完全平方数,则连接一条边。最后得到一个无权图,原问题转化为一个求这个无权图中从n到0的最短路径。由于这里是图而不是树,一个节点到另一个节点有多种不同的路径,为了防止节点重复入队,注意要设置一个标记数组,防止程序超时。
AC代码:

class Solution
{
public:
    int numSquares(int n)
    {
        queue<pair<int,int>> q;
        q.push(make_pair(n,0));
        //标记数组,防止节点重复入队,避免程序超时
        vector<bool> visited(n+1,false);
        visited[n]=true;
        while(!q.empty())
        {
            int num=q.front().first;
            int step=q.front().second;
            q.pop();
            for(int i=1; ; i++)
            {
                int temp=num-i*i;
                if(temp<0)
                    break;
                if(temp==0)
                    return step+1;
                if(!visited[temp]) 
                {
                    q.push(make_pair(temp,step+1));
                    visited[temp] = true;
                }
            }
        }
    }
};

leetcode279 Perfect Squares(完全平方数)_第1张图片

你可能感兴趣的:(leetcode刷题练习,图,数据结构,队列,面试题,笔试题面试题刷题,算法,LeetCode刷题练习,数据结构,C++,队列,图论,leetcode做题代码合集)