leetcode--重新规划路线

 题目是LeetCode第191场周赛的第三题,链接:1466. 重新规划路线。具体描述见原题。

 题目可以用BFS来解决,不过首先我们需要先建立两个邻接表toNextreverse分别代表正常的邻接表和逆的邻接表(也就是边的方向反了过了)。然后套用BFS模板,先将0号节点入队,只要队列非空就执行以下循环:

  • 出队一个节点node,从toNext中获得node的邻接节点,只要未访问过则入队(同时这表明有一条路径需要进行反转),从reverse获得指向node的那些节点,只要未访问过,就入队(这种路径不用反转,已经是符合要求的了)。

 每个节点最多出入队一次,故时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)

 JAVA版代码如下:

class Solution {
    public int minReorder(int n, int[][] connections) {
        Map<Integer, List<Integer>> toNext = new HashMap<>();
        Map<Integer, List<Integer>> reverse = new HashMap<>();
        for (int[] c : connections) {
            if (toNext.containsKey(c[0])) {
                toNext.get(c[0]).add(c[1]);
            }
            else {
                List<Integer> item = new LinkedList<>();
                item.add(c[1]);
                toNext.put(c[0], item);
            }
            if (reverse.containsKey(c[1])) {
                reverse.get(c[1]).add(c[0]);
            }
            else {
                List<Integer> item = new LinkedList<>();
                item.add(c[0]);
                reverse.put(c[1], item);
            }
        }
        Queue<Integer> queue = new LinkedList<>();
        queue.offer(0);
        int result = 0;
        boolean[] visited = new boolean[n];
        visited[0] = true;
        while (!queue.isEmpty()) {
            int node = queue.poll();
            if (reverse.containsKey(node)) {
                for (int nextNode : reverse.get(node)) {
                    if (!visited[nextNode]) {
                        visited[nextNode] = true;
                        queue.offer(nextNode);
                    }
                }
            }
            if (toNext.containsKey(node)) {
                for (int nextNode : toNext.get(node)) {
                    if (!visited[nextNode]) {
                        visited[nextNode] = true;
                        queue.offer(nextNode);
                        ++result;
                    }
                }
            }
        }
        return result;
    }
}

 提交结果如下:


 这里时间不咋地,因为题目的测试数据比较弱,是有排序关系的,所以看了一下有不少人利用这一点从而没有建邻接表,但是这种做法在输入数据一旦乱序的话答案就错了,所以这里先不纠结时间不咋地的问题了。

 Python版代码如下:

class Solution:
    def minReorder(self, n: int, connections: List[List[int]]) -> int:
        toNext = collections.defaultdict(list)
        reverse = collections.defaultdict(list)
        visited = [False] * n
        for con in connections:
            toNext[con[0]].append(con[1])
            reverse[con[1]].append(con[0])
        queue = collections.deque()
        queue.append(0)
        visited[0] = True
        result = 0
        while len(queue) > 0:
            node = queue.popleft()
            for nextNode in reverse[node]:
                if not visited[nextNode]:
                    visited[nextNode] = True
                    queue.append(nextNode)
            for nextNode in toNext[node]:
                if not visited[nextNode]:
                    visited[nextNode] = True
                    queue.append(nextNode)
                    result += 1
        return result

 提交结果如下:


LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值