leetcode 815. 公交路线

题目链接: 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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值