全排列(力扣第46題)

2021-10-07 19:23:30 字數 1743 閱讀 9567

題目:給定乙個 沒有重複數字的序列,返回其所有可能的全排列。

示例:

輸入: [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>();

listsortres = 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(int nums) 

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...