思路
使用广度优先搜索BFS
进行处理,因为在计算过程中可能会设计多个元素重复出现,使用Map
存储不合适,使用另一个队列
存储对应元素的对应step。
因为最终求的是step等于k
的方案数量,所以当出现第一个step大于k
的元素时证明后续的元素已经不存在可行的方案了,所以直接可以break
。
时间复杂度为O(nk)O(n^k)O(nk)
代码
class Solution {
public int numWays(int n, int[][] relation, int k) {
int ans = numWaysBFS(relation, n, k);
return ans;
}
public int numWaysBFS(int[][] r,int num,int k)
{
Deque<Integer> d = new ArrayDeque<>();//存储元素
Deque<Integer> d2 = new ArrayDeque<>();//存储元素对应的step
d.addLast(0);
d2.addLast(0);
int count = 0;
while( !d.isEmpty())
{
int p = d.pollFirst();
int step = d2.pollFirst();
// System.out.println(p+"--"+step);
if (step>k)
break;
if (step==k && p==(num-1))
count++;
for (int i=0;i<r.length;i++)
{
if (r[i][0]==p)
{
d2.addLast(step+1);
d.addLast(r[i][1]);
}
}
}
return count;
}
}