檢查陣列是否僅使用給定索引之間的交換在 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
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP