題目:給定乙個 沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]輸出:[[
1,2,3],[
1,3,2],[
2,1,3],[
2,3,1],[
3,1,2],[
3,2,1
]]
分析:
求給定一組數的全排列,也就是排列組合問題,所以屬於backtracking(回溯)問題,通過dfs解決,只不過需要注意的是,我們一般使用dfs的時候都會設定乙個訪問標記的陣列,用於保證深度遞迴的過程中,某乙個元素不會被重複訪問,但是由於現在我們要求的是排列組合問題,所以我們要盡可能的把所有的解求出來,那麼只要一條遞迴路徑中有乙個元素不同,那就是不用的遞迴路徑,所以當我們從乙個元素遞迴返回的時候,要將此元素對應於訪問標記陣列中的值復位,保證從其他路徑路過此元素時,能夠正常的訪問。
**實現:
private list>reslist;public list> permute(int
nums)
int n =nums.length;
boolean isvisited = new
boolean
[n];
reslist = new arraylist>();
list
sortres = new arraylist<>();
for (int i = 0; i < nums.length; i++)
return
reslist;
}private
void findallsort(int nums, int i, boolean isvisited, listsortres)
isvisited[i] = true
; sortres.add(nums[i]);
if (sortres.size() ==nums.length)
for (int i1 = 0; i1 < isvisited.length; i1++)
}isvisited[i] = false
; sortres.remove(sortres.size()-1);
}
記住,當遍歷完一條路徑的時候,給此路徑新增到結果列表,需要新建乙個list物件,然後將sortres結果傳進去,直接將sortres新增到結果列表中是不行的,因為當我們再一次修改sortlist時,原先存於結果列表的內容也會被修改。
public list> permute(intnums)
private
void backtracking(listpermutelist, list> permutes, boolean visited, final
int nums)
for (int i = 0; i < visited.length; i++)
visited[i] = true
; permutelist.add(nums[i]);
backtracking(permutelist, permutes, visited, nums);
permutelist.remove(permutelist.size() - 1);
visited[i] = false
; }
}
參考:cyc2018
全排列(力扣第46題)
題目 給定乙個 沒有重複數字的序列,返回其所有可能的全排列。示例 輸入 1,2,3 輸出 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1 分析 求給定一組數的全排列,也就是排列組合問題,所以屬於backtracking 回溯 問題,通過dfs解決,只不過需要注意的是,我們一般...
力扣46 全排列
給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。這道題其實就是看你如何遍歷這棵搜尋樹。輸入1,2,3情況下的求解樹,如下 如果用dfs來做 第一種思路,交換 可能比較難想到 說白了每次挑乙個數字出來,為了保證不重複,我就換就行了嘛。void perm int list,int k,int m...
力扣 46 全排列
傳送門 給定乙個沒有重複數字的數列,輸入該數列的全排列。這是一道回溯法 遞迴思想 的題目,可以通過遞迴來列舉所有的排列組合,為了避免重複使用某個數字,可以用flag標記每個數字是否使用。方面,回溯法的框架如下,細品 result def backtrack 路徑,選擇列表 if滿足結束條件 resu...