標籤:des style blog http color os io 使用 ar
深度優先搜尋演算法(depth first search),是一個典型的圖論演算法。所遵循的搜尋策略是儘可能“深”地去搜尋一個圖。
演算法思想是:
對於新發現的頂點v,如果它有以點v為起點的未探測的邊,則沿此邊繼續探測下去。當頂點v的所有邊都已被探尋結束,則回溯到到達點v的先輩節點。以相同方法一直回溯到源節點為止。如果圖中還有未被發現的頂點,則選擇其中一個作為源頂點,重複以上的過程。最後的結果是一些不相交的深度優先樹。
leetCode中的應用:
Given a collection of integers that might contain duplicates, S, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2], a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], []]
可以使用DFS來解答,通過構造二叉樹,然後得到所有子集為二叉樹的所有葉子節點,然後使用DFS演算法,將所有葉子節點輸出。
構造二叉樹如下:
實現代碼如下(參考網上):
public List<List<Integer>> subsetsWithDup(int[] num) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if(num == null ||num.length == 0){ return res; } int len = num.length; Arrays.sort(num);//對數組裡的數排序 for(int i=1; i<len+1; i++){ ArrayList<Integer> numList = new ArrayList<Integer>(); dfs(res,numList,num,0,i); } res.add(new ArrayList<Integer>()); return res; } private void dfs(List<List<Integer>> res, ArrayList<Integer> numList, int[] num, int start, int k) { if(numList.size() == k){ res.add(new ArrayList<Integer>(numList)); return; } ArrayList<Integer> allList = new ArrayList<Integer>(); for(int i=start; i<num.length; i++){ if(allList.contains(num[i])) continue; allList.add(num[i]); numList.add(num[i]); dfs(res, numList, num, i+1, k); numList.remove(numList.size()-1); } }
深度優先搜尋演算法(DFS)以及leetCode的subsets II