leetcode--重新規劃路線
題目是LeetCode第191場周賽的第三題,連結:1466. 重新規劃路線。具體描述見原題。
題目可以用BFS來解決,不過首先我們需要先建立兩個鄰接表toNext
和reverse
分別代表正常的鄰接表和逆的鄰接表(也就是邊的方向反了過了)。然後套用BFS模板,先將0
號節點入隊,只要佇列非空就執行以下迴圈:
- 出隊一個節點
node
,從toNext
中獲得node
的鄰接節點,只要未訪問過則入隊(同時這表明有一條路徑需要進行反轉),從reverse
獲得指向node
的那些節點,只要未訪問過,就入隊(這種路徑不用反轉,已經是符合要求的了)。
每個節點最多出入隊一次,故時間複雜度為 O ( n ) O(n) O(n),空間複雜度為 O ( n ) O(n) O(n)。
JAVA版程式碼如下:
class Solution {
public int minReorder(int n, int[][] connections) {
Map<Integer, List<Integer>> toNext = new HashMap<>();
Map<Integer, List<Integer>> reverse = new HashMap<>();
for (int[] c : connections) {
if (toNext.containsKey(c[0])) {
toNext.get(c[0]).add(c[1]);
}
else {
List<Integer> item = new LinkedList<>();
item.add(c[1]);
toNext.put(c[0], item);
}
if (reverse.containsKey(c[1])) {
reverse.get(c[1]).add(c[0]);
}
else {
List<Integer> item = new LinkedList<>();
item.add(c[0]);
reverse.put(c[1], item);
}
}
Queue<Integer> queue = new LinkedList<>();
queue.offer(0);
int result = 0;
boolean[] visited = new boolean[n];
visited[0] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
if (reverse.containsKey(node)) {
for (int nextNode : reverse.get(node)) {
if (!visited[nextNode]) {
visited[nextNode] = true;
queue.offer(nextNode);
}
}
}
if (toNext.containsKey(node)) {
for (int nextNode : toNext.get(node)) {
if (!visited[nextNode]) {
visited[nextNode] = true;
queue.offer(nextNode);
++result;
}
}
}
}
return result;
}
}
提交結果如下:
這裡時間不咋地,因為題目的測試資料比較弱,是有排序關係的,所以看了一下有不少人利用這一點從而沒有建鄰接表,但是這種做法在輸入資料一旦亂序的話答案就錯了,所以這裡先不糾結時間不咋地的問題了。
Python版程式碼如下:
class Solution:
def minReorder(self, n: int, connections: List[List[int]]) -> int:
toNext = collections.defaultdict(list)
reverse = collections.defaultdict(list)
visited = [False] * n
for con in connections:
toNext[con[0]].append(con[1])
reverse[con[1]].append(con[0])
queue = collections.deque()
queue.append(0)
visited[0] = True
result = 0
while len(queue) > 0:
node = queue.popleft()
for nextNode in reverse[node]:
if not visited[nextNode]:
visited[nextNode] = True
queue.append(nextNode)
for nextNode in toNext[node]:
if not visited[nextNode]:
visited[nextNode] = True
queue.append(nextNode)
result += 1
return result
提交結果如下:
相關文章
- LeetCode-5426、重新規劃路線-中等LeetCode
- Web前端找工作晉升路線規劃Web前端
- 【精華】安卓開發學習路線規劃安卓
- 人工智慧的學習路線規劃人工智慧
- 程式設計師如何規劃職業路線?程式設計師
- 路徑規劃: 淺談路徑規劃演算法演算法
- 關於 線性規劃 非線性規劃 與 凸優化優化
- 蘋果承諾重新規劃藍寶石工廠蘋果
- Linux再學習(一)-學習路線規劃Linux
- matlab線性規劃Matlab
- 動態規劃-----線性動態規劃
- 微信小程式 + 騰訊地圖SDK 實現路線規劃微信小程式地圖
- 企業無線網路裝置的未來規劃
- Web前端初學者應如何規劃學習路線呢?Web前端
- Wireless_網路規劃
- 線性規劃對偶原理
- 零基礎java培訓如何規劃學習路線Java
- 大資料學習入門規劃?和學習路線大資料
- 做題筆記——網路流與線性規劃24題筆記
- 網路規劃與設計
- Java工程師如何做好職業規劃和成長路線?Java工程師
- iOS 使用百度地圖進行定位和路線規劃iOS地圖
- React 高德地圖 進京證 路線規劃 問題小記React地圖
- 動態規劃篇——線性DP動態規劃
- matlab求解非線性規劃Matlab
- 想問一下這樣規劃的學習路線可以嗎
- 遊戲AI研究(三):路徑規劃遊戲AI
- 路徑規劃之A*演算法演算法
- RRT路徑規劃演算法演算法
- PRM路徑規劃演算法演算法
- UVA 10498 Happiness!(線性規劃)APP
- 線性規劃模型複習總結模型
- matlab求解線性規劃問題Matlab
- 機器人路徑規劃 A*與D*機器人路徑規劃演算法詳述機器人演算法
- Java技術自學規劃(學習路線圖、書籍、視訊總結)Java
- Paper Time|開放式時空大資料助力智慧公交路線規劃大資料
- 百度地圖開發(五)之公交資訊檢索 + 路線規劃地圖
- 簡單的路徑規劃案例分享