我一直在研究這個HackerRank問題一段時間了,而且我似乎無法理解爲什麼我的代碼在超大輸入大小的情況下超時。我已經將鄰接列表實現爲一個哈希映射來減少時間,並且已經爲我的DFS使用了一個堆棧,按標準來優化它的運行時間。我的基本策略是使用DFS刪除一組連接的節點,並繼續這樣做直到沒有剩餘的節點(我的DFS會在節點到達時刪除節點),問題是在每個圖表後通常有80,000個斷開連接的部分我拿出沒有鄰居的單個節點(所以DFS被稱爲80,000次)。這裏有沒有特別好的策略?HackerRack上的道路和圖書館超時
static int numDisconnected(HashMap<Integer, List<Integer>> adj) {
int result = 0;
List<Integer> iter = new ArrayList<>(adj.keySet());
for (int k : iter) {
if (adj.get(k).size() == 0) {
adj.remove(k);
result++;
}
}
HashMap<Integer,Boolean> explored = new HashMap<>();
for (int i : adj.keySet()) {
explored.put(i,false);
}
while (!adj.keySet().isEmpty()) {
result++;
depthFirstSearch(adj,explored);
}
return result;
}
作爲一個參考點,我的代碼大約需要1.5秒鐘在我的機器上運行〜2MB文件輸入。
我建議你做一些分析和縮小問題的代碼減少到10條線以下。如果你在這樣做後仍然陷入困境,你可以回來一個更具體的問題。 –
@JoeC我現在要做的就是 – robcarney
一個觀察:所有'HashMap'中的鍵都是連續的整數,所以數組可能更有效。 (HackerRank挑戰使用基於1的城市指數,所以一定要減去一個。) – smarx