思路:
才用广度优先搜索
每次把 减去平方数的差值 和 搜索深度 入队
遍历,第一次找到差值0时,对应的搜索深度即所求。
提高:
要避免重复访问,如果之前已经访问过了某个num(差值),就没必要再次访问num了(应为已经通过更少的数字个数减小到了这个数字了)
总结:
广度优先搜索的模板要记牢。
根节点入队
while 队列非空
取出队首
对队首元素进行操作判断,是否返回ret
不返回ret,下一层节点入队(一般通过for循环)
如果要避免重复,需要在for循环中进行条件判断,看
是否入队,并标记
可选 更新标记变量。
return fail
代码:
class Solution {
public:
int numSquares(int n) {
vector<bool> visited(n,false);
queue<pair<int,int>> qu;
qu.push(make_pair(n,0));
while(!qu.empty()){
int num=qu.front().first;
int count=qu.front().second;
qu.pop();
if(num==0)
return count;
for(int i=1;i*i<=num;++i){
int temp=num-i*i;
if(visited[temp]==false){
visited[temp]=true;
qu.push(make_pair(temp,count+1));
}
}
}
return -1;
}
};
网友评论