小C的排列询问问题笔记 | 豆包MarsCode AI刷题

178 阅读4分钟

小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

思路分析

  1. 理解排列

    • 排列是一个长度为 ( n ) 的数组,其中每个数字从 1 到 ( n ) 恰好出现一次。
    • 例如,对于 ( n = 4 ),一个有效的排列可能是 [1, 4, 2, 3]
  2. 查找元素位置

    • 我们需要找到元素 ( x ) 和 ( y ) 在排列中的位置。
    • 可以使用一个循环遍历排列,记录 ( x ) 和 ( y ) 的索引。
  3. 判断相邻

    • 两个元素 ( 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

详细步骤

  1. 初始化索引

    • 定义两个变量 index_xindex_y,初始值为 -1,用于记录 ( x ) 和 ( y ) 在排列中的索引。
  2. 遍历排列

    • 使用一个循环遍历排列 a,在每次迭代中检查当前元素是否等于 ( x ) 或 ( y )。
    • 如果找到了 ( x ) 或 ( y ),记录其索引。
  3. 提前结束循环

    • 如果在遍历过程中已经找到了 ( x ) 和 ( y ) 的索引,可以提前结束循环,以提高效率。
  4. 判断相邻

    • 使用 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,因此它们是相邻的。

代码优化

  1. 减少不必要的遍历

    • 一旦找到了 ( x ) 和 ( y ) 的索引,可以立即退出循环,避免不必要的遍历。
  2. 使用字典记录索引

    • 可以使用字典来记录每个元素的索引,这样可以在 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