问题描述
小C拿到了一个排列,她想知道在这个排列中,元素 x 和 y 是否是相邻的。排列是一个长度为 n 的数组,其中每个数字从 11到 n恰好出现一次。
你的任务是判断在给定的排列中,x 和 y 是否是相邻的。
测试样例
样例1:
输入:
n = 4, a = [1, 4, 2, 3], x = 2, y = 4
输出:True
样例2:
输入:
n = 5, a = [3, 4, 5, 1, 2], x = 3, y = 2
输出:False
样例3:
输入:
n = 6, a = [6, 1, 5, 2, 4, 3], x = 5, y = 2
输出:True
题目解析
这个要写的话感觉有很多解法,题目也很明确告诉了我们就是判断x,y是否相邻,而在一个列表里面最简单的就是直接找到对应元素的位置,看看是否相邻就完事,那么问题就在如何在列表中,找到它们两个的位置,没错,判断两个元素是否相邻的核心在于找到它们在列表中的位置,然后比较位置是否相差 1。而列表的性质使得我们可以采用多种解法来解决这个问题。下面我们具体分析几种不同的解法,以及它们的优缺点。
方法一:直接使用 index 查找
最简单直观的办法是直接使用 Python 提供的 index 方法。我们依次找到元素 x 和 y 在列表中的索引位置,接着比较它们的位置差是否为 1。
这种方法的优势在于代码简洁,易于理解,适合小规模数组。示例代码如下:
def solution(n, a, x, y):
index_x = a.index(x)
index_y = a.index(y)
return abs(index_x - index_y) == 1
这种方法的时间复杂度为 O(n)O(n),因为 index 方法会遍历列表来找到对应元素。如果列表规模较大,可能存在性能瓶颈。
方法二:一次遍历找到两个索引
考虑到 index 方法需要遍历列表,我们可以通过一次遍历同时找到 x 和 y 的位置,从而减少重复遍历:
def solution(n, a, x, y):
index_x, index_y = -1, -1
for i, val in enumerate(a):
if val == x:
index_x = i
if val == y:
index_y = i
if index_x != -1 and index_y != -1:
break
return abs(index_x - index_y) == 1
在这种方法中,我们在同一次遍历中寻找 x 和 y,一旦找到就提前退出,优化了查找的效率。
方法三:使用字典存储位置
如果我们需要频繁地判断多个元素对是否相邻,可以通过预处理数组来优化查询效率。我们将列表的值与其索引存入字典中,随后直接通过字典获取元素的位置:
def solution(n, a, x, y):
pos = {val: idx for idx, val in enumerate(a)}
return abs(pos[x] - pos[y]) == 1
这种方法的时间复杂度为 O(n)O(n) 用于构建字典,单次查询的时间复杂度为 O(1)O(1)。适用于多次查询的场景。
总结
无论采用哪种方法,最终的核心都是找到两个元素的位置,然后判断它们的索引差是否为 1。根据具体的需求场景,我们可以选择不同的解法:
- 如果只判断一次,直接使用
index方法或一次遍历法即可。 - 如果需要多次查询,字典预处理法更高效。
题目看似简单,但可以引申出多种实现方式和优化点,体现了算法设计的灵活性和针对性。