题目链接: leetcode 815. 公交路线
题解:
1,每条公交路线可以抽象看成一辆公交车.
2,任意两辆公交车如果他们有公共车站,那么他们是可达的.
3,通过给的start车站可以确认有几辆公交车可以作为起点.
4,终止条件是到达包含终点的公交车.
5,由于求的是公交车数量最少的路线,所以用BFS进行搜索更好.
代码注意点:
1,java中队列出队(poll方法)和入队(offer方法)
2, .java文件头不要忘记导包.
3,java中有专门处理点的类Point
import java.awt.Point;
class Solution {
public int numBusesToDestination(int[][] routes, int source, int target) {
if(source==target) return 0;
ArrayList<ArrayList<Integer>> graph=new ArrayList<>();
for (int[] route : routes) {
Arrays.sort(route);
graph.add(new ArrayList<>());
}
for(int i=0; i<routes.length; i++){
for(int j=i+1; j<routes.length; j++){
if(connect(routes[i],routes[j])){
graph.get(i).add(j);
graph.get(j).add(i);
}
}
}
Set<Integer> visited=new HashSet<>();
Set<Integer> end=new HashSet<>();
Deque<Point> points=new ArrayDeque<>();
for (int i = 0; i < routes.length; i++) {
if(Arrays.binarySearch(routes[i],source)>=0){
points.offer(new Point(i,1));
visited.add(i);
}
if(Arrays.binarySearch(routes[i],target)>=0){
end.add(i);
}
}
while(!points.isEmpty()){
Point temp=points.pop();
if(end.contains(temp.x)){
return temp.y;
}
for (Integer integer : graph.get(temp.x)) {
if(!visited.contains(integer)){
visited.add(integer);
points.offer(new Point(integer,temp.y+1));
}
}
}
return -1;
}
private boolean connect(int[] route, int[] route1) {
int i=0;
int j=0;
while(i<route.length&&j<route1.length){
if(route[i]==route1[j])return true;
if(route[i]<route1[j])i++;else j++;
}
return false;
}
}