小C的排列询问问题笔记
问题描述
小C拿到了一个排列,她想知道在这个排列中,元素 ( x ) 和 ( y ) 是否是相邻的。排列是一个长度为 ( n ) 的数组,其中每个数字从 1 到 ( n ) 恰好出现一次。我们的任务是判断在给定的排列中,( x ) 和 ( y ) 是否是相邻的。
输入格式
- 第一行包含一个整数 ( n ),表示排列的长度。
- 第二行包含 ( n ) 个整数,表示排列中的元素。
- 第三行包含两个整数 ( x ) 和 ( y ),表示需要判断是否相邻的两个元素。
输出格式
- 输出一个布尔值,如果 ( x ) 和 ( y ) 在排列中是相邻的,输出
True,否则输出False。
示例
输入:
4
1 4 2 3
2 4
输出:
True
思路分析
-
理解排列:
- 排列是一个长度为 ( n ) 的数组,其中每个数字从 1 到 ( n ) 恰好出现一次。
- 例如,对于 ( n = 4 ),一个有效的排列可能是
[1, 4, 2, 3]。
-
查找元素位置:
- 我们需要找到元素 ( x ) 和 ( y ) 在排列中的位置。
- 可以使用一个循环遍历排列,记录 ( x ) 和 ( y ) 的索引。
-
判断相邻:
- 两个元素 ( x ) 和 ( y ) 是相邻的,当且仅当它们在排列中的索引相差 1。
- 例如,在排列
[1, 4, 2, 3]中,2 和 4 的索引分别是 2 和 1,相差 1,因此它们是相邻的。
代码实现
def solution(n: int, a: list, x: int, y: int) -> bool:
# 找到 x 和 y 在排列中的索引
index_x = -1
index_y = -1
for i in range(n):
if a[i] == x:
index_x = i
elif a[i] == y:
index_y = i
# 如果已经找到了 x 和 y 的索引,提前结束循环
if index_x != -1 and index_y != -1:
break
# 判断索引是否相邻
if index_x == -1 or index_y == -1:
return False # 如果没有找到 x 或 y,返回 False
return abs(index_x - index_y) == 1
if __name__ == '__main__':
# 示例输入
n = 4
a = [1, 4, 2, 3]
x = 2
y = 4
# 调用 solution 函数并输出结果
print(solution(n, a, x, y) == True) # 应该输出 True
详细步骤
-
初始化索引:
- 定义两个变量
index_x和index_y,初始值为 -1,用于记录 ( x ) 和 ( y ) 在排列中的索引。
- 定义两个变量
-
遍历排列:
- 使用一个循环遍历排列
a,在每次迭代中检查当前元素是否等于 ( x ) 或 ( y )。 - 如果找到了 ( x ) 或 ( y ),记录其索引。
- 使用一个循环遍历排列
-
提前结束循环:
- 如果在遍历过程中已经找到了 ( x ) 和 ( y ) 的索引,可以提前结束循环,以提高效率。
-
判断相邻:
- 使用
abs(index_x - index_y) == 1判断 ( x ) 和 ( y ) 的索引是否相差 1。 - 如果索引相差 1,则 ( x ) 和 ( y ) 是相邻的,返回
True;否则返回False。
- 使用
复杂度分析
- 时间复杂度:O(n),因为我们需要遍历整个排列一次。
- 空间复杂度:O(1),因为我们只使用了常数级的额外空间。
测试用例
-
示例 1:
输入: 4 1 4 2 3 2 4 输出: True- 解释:在排列
[1, 4, 2, 3]中,2 和 4 的索引分别是 2 和 1,相差 1,因此它们是相邻的。
- 解释:在排列
-
示例 2:
输入: 5 3 4 5 1 2 3 2 输出: False- 解释:在排列
[3, 4, 5, 1, 2]中,3 和 2 的索引分别是 0 和 4,相差 4,因此它们不是相邻的。
- 解释:在排列
-
示例 3:
输入: 6 6 1 5 2 4 3 5 2 输出: True- 解释:在排列
[6, 1, 5, 2, 4, 3]中,5 和 2 的索引分别是 2 和 3,相差 1,因此它们是相邻的。
- 解释:在排列
代码优化
-
减少不必要的遍历:
- 一旦找到了 ( x ) 和 ( y ) 的索引,可以立即退出循环,避免不必要的遍历。
-
使用字典记录索引:
- 可以使用字典来记录每个元素的索引,这样可以在 O(1) 时间内查找索引,但会增加空间复杂度。
def solution(n: int, a: list, x: int, y: int) -> bool:
index_map = {}
for i in range(n):
index_map[a[i]] = i
index_x = index_map.get(x, -1)
index_y = index_map.get(y, -1)
if index_x == -1 or index_y == -1:
return False
return abs(index_x - index_y) == 1
if __name__ == '__main__':
# 示例输入
n = 4
a = [1, 4, 2, 3]
x = 2
y = 4
# 调用 solution 函数并输出结果
print(solution(n, a, x, y) == True) # 应该输出 True