815. Bus Routes

We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. For example if routes[0] = [1, 5, 7], this means that the first bus (0-th indexed) travels in the sequence 1->5->7->1->5->7->1->… forever.
We start at bus stop S (initially not on a bus), and we want to go to bus stop T. Travelling by buses only, what is the least number of buses we must take to reach our destination? Return -1 if it is not possible.

Example:
Input:
routes = [[1, 2, 7], [3, 6, 7]]
S = 1
T = 6
Output: 2
Explanation:
The best strategy is take the first bus to the bus stop 7, then take the second bus to the bus stop 6.

Note:
1 <= routes.length <= 500.
1 <= routes[i].length <= 500.
0 <= routes[i][j] < 10 ^ 6.

BFS求解,程序如下所示:

class Solution {
    public int numBusesToDestination(int[][] routes, int S, int T) {
        if (S == T){
            return 0;
        }
        List<List<Integer>> list = new ArrayList<>();
        for (int i = 0; i < routes.length; ++ i){
            Arrays.sort(routes[i]);
            list.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < routes.length; ++ i){
            for (int j = i + 1; j < routes.length; ++ j){
                if (intersection(routes[i], routes[j])){
                    list.get(i).add(j);
                    list.get(j).add(i);
                }
            }
        }
        Set<Integer> begin = new HashSet<>();
        Set<Integer> target = new HashSet<>();
        Queue<Integer> que = new ArrayDeque<>();
        Queue<Integer> depth = new ArrayDeque<>();
        for (int i = 0; i < routes.length; ++ i){
            if (Arrays.binarySearch(routes[i], S) >= 0){
                begin.add(i);
                que.offer(i);
                depth.offer(0);
            }
            if (Arrays.binarySearch(routes[i], T) >= 0){
                target.add(i);
            }
        }
        while (!que.isEmpty()){
            int size = que.size();
            for (int i = 0; i < size; ++ i){
                int node = que.poll();
                int dep = depth.poll();
                if (target.contains(node)){
                    return dep + 1;
                }
                for (Integer neighbor : list.get(node)){
                    if (!begin.contains(neighbor)){
                        begin.add(neighbor);
                        que.offer(neighbor);
                        depth.offer(dep + 1);
                    }
                }
            }
        }
        return -1;
    }
    
    public boolean intersection(int[] A, int[] B){
        int i = 0, j = 0;
        while (i < A.length && j < B.length){
            if (A[i] == B[j]){
                return true;
            }
            else if (A[i] < B[j]){
                i ++;
            }
            else {
                j ++;
            }
        }
        return false;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值