leetcode
leetcode 1301 ~ 1350
旅行终点站

旅行终点站

难度:

标签:

题目描述

代码结果

运行时间: 18 ms, 内存: 16.1 MB


/*
 * Problem: Given a list of paths where each path represents a direct trip from city A to city B, 
 * the goal is to find the final destination city which has no outgoing paths.
 * Approach: Use Java Streams to process the list of paths, extract destination cities, and filter out starting cities.
 */
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class DestinationCityStream {
    public String destCity(List<List<String>> paths) {
        // Create a set of destination cities using streams
        Set<String> destinationSet = paths.stream()
            .map(path -> path.get(1))
            .collect(Collectors.toSet());

        // Remove all cities that are starting points of any path
        paths.stream()
            .map(path -> path.get(0))
            .forEach(destinationSet::remove);

        // The remaining city is the final destination
        return destinationSet.iterator().next();
    }
}

解释

方法:

题解的思路是通过使用两个集合来区分起始城市和目的地城市。对于每一条路径,将起点城市添加到起始集合,将终点城市添加到终点集合。由于每个城市只有一条出发路线,终点站将不会出现在起始集合中。因此,通过计算终点集合与起始集合的差集,即可得到终点站。由于题目保证了路径的连续性且无环,这个差集中将只有一个元素,即为我们需要的终点站。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在题解中使用集合来区分起始城市和目的地城市的方法是否能有效处理所有情况,例如连续多个路径有相同的起始或终点城市的情况?
是的,题解中使用的方法可以有效处理所有情况,包括连续多个路径有相同的起始或终点城市的情况。由于集合只存储唯一元素,即使多条路径的起点或终点相同,也只会在集合中保留一个该城市的记录。因此,这种方法可以准确地通过集合运算找出唯一的终点城市,这是因为终点城市将不会出现在任何路径的起点中。
🦆
为什么题解中选择使用集合而不是列表或字典来存储起点和终点城市,集合在这里有什么特别的优势?
题解中选择使用集合而不是列表或字典主要是因为集合提供了快速的成员检查和独特性保证。集合自动处理重复元素,确保每个元素只出现一次,这在检查路径起点和终点是否重复时非常有用。此外,集合提供了方便的集合操作方法,如差集,这可以直接用来找到不在起点集合中的终点,这种操作如果使用列表或字典实现,则会更加复杂和耗时。
🦆
题解中提到的计算两个集合的差集的过程中,如果存在多个城市不在起始集合中会怎样处理?
根据题目的设定,每个城市只有一条出发路线,确保了路径的连续性且无环,因此在正常情况下,终点集合与起点集合的差集中应只有一个元素,即最终的终点站。如果存在多个不在起始集合中的城市,则这可能表明输入数据不符合题目的假设条件。在这种情况下,题解的逻辑需要重新审视,或需要更多信息来正确处理异常情况。
🦆
在实际的Python代码实现中,`list(finish_set - start_set)[0]`这一行是否有潜在的风险,例如当差集为空时会发生什么?
是的,这一行代码有潜在的风险。如果差集为空,即`finish_set - start_set`结果为空集,那么将其转换为列表后访问第一个元素`[0]`会引发`IndexError`异常,因为列表中没有任何元素。在实际应用中,应该先检查差集是否为空,以避免运行时错误。可以通过添加适当的错误处理或条件检查来增强代码的健壮性。

相关问题