检查数组是否仅使用给定索引之间的交换在 Python 中进行排序
假设我们有一个名为 nums 的数组,其中包含来自范围 [0,n – 1] 的唯一值。此数组未排序。我们还有另一个配对数组,其中每个配对包含数组元素可以交换的索引。我们可以交换多次。我们必须检查我们是否可以使用这些交换将数组排列成排序顺序。
因此,如果输入类似于 nums = [6,1,7,3,0,5,4,2] pairs = [(0,4),(6,0),(2,7)],则输出将为 True,因为我们可以交换索引 (2,7) 数组将为 [6,1,2,3,0,5,4,7],然后交换 (6,0),数组将为 [4,1,2,3,0,5,6,7],然后交换 (0,4) 以获得 [0,1,2,3,4,5,6,7]。
为了解决这个问题,我们将遵循以下步骤:
- N := nums 的大小,P := pairs 数组中的配对数
- v := 一个包含 N 个子列表的列表
- visited := 一个新的集合
- 对于 i 从 0 到 P,执行以下操作:
- 将 pairs[i] 的第二个索引插入 v[pairs[i] 的第一个索引] 中
- 将 pairs[i] 的第一个索引插入 v[pairs[i] 的第二个索引] 中
- 对于 i 从 0 到 N,执行以下操作:
- 如果 i 未被访问,则:
- que := 一个双端队列
- arr_first := 一个新的列表
- arr_second := 一个新的列表
- 将 i 标记为已访问
- 将 i 插入 que 的末尾
- 当 que 不为空时,执行以下操作:
- u := que 的第一个元素,并删除 que 的第一个元素
- 将 u 插入 arr_first 的末尾
- 将 nums[u] 插入 arr_second 的末尾
- 对于 v[u] 中的每个 s,执行以下操作:
- 如果 s 未被访问,则:
- 将 s 标记为已访问
- 将 s 插入 que 的末尾
- 如果 s 未被访问,则:
- arr_first := 对列表 arr_first 进行排序
- arr_second := 对列表 arr_second 进行排序
- 如果 arr_first 与 arr_second 不相同,则:
- 返回 False
- 如果 i 未被访问,则:
- 返回 True
让我们看看以下实现以获得更好的理解:
示例代码
from collections import deque def solve(nums, pairs): N = len(nums) P = len(pairs) v = [[] for i in range(N)] visited = set() for i in range(P): v[pairs[i][0]].append(pairs[i][1]) v[pairs[i][1]].append(pairs[i][0]) for i in range(N): if i not in visited: que = deque() arr_first = [] arr_second = [] visited.add(i) que.append(i) while len(que) > 0: u = que.popleft() arr_first.append(u) arr_second.append(nums[u]) for s in v[u]: if s not in visited: visited.add(s) que.append(s) arr_first = sorted(arr_first) arr_second = sorted(arr_second) if arr_first != arr_second: return False return True nums = [6,1,7,3,0,5,4,2] pairs = [(0,4),(6,0),(2,7)] print(solve(nums, pairs))
输入
[6,1,7,3,0,5,4,2], [(0,4),(6,0),(2,7)]
输出
True
广告