【LeetCode练习题】Permutations
全排列
Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]have the following permutations:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], and[3,2,1].
題目意思:
給定一個集合,求全排列。
解題思路:
一般的話,有兩種思路可以考慮。遞歸和DFS遍歷樹。
這里我只用了遞歸的方法,關于怎么建一棵樹然后DFS,可以參考 這里。
這對于練習對遞歸的理解真是個不錯的題目。
以[1,2,3]舉例,可以用紙筆畫一畫,分別以1,2,3為根,畫出三棵樹來,然后由根到每一個節點就對應著一個排列。
首先最外層肯定要有一個for循環來一次遍歷這里面的元素決定出根節點,然后在循環中遞歸。
其中,有兩點需要注意的:
要設置一個bool型的visited數組,大小和num一樣大,來標記num中對應的元素是否已經訪問過了,對于還沒有訪問過的,我們才可以把它加到element里來。這樣可以避免在樹的不同層出現同一個數。
在element已經完成了一次排列后,對element進行pop_back(),然后將pop出來的數對應的visited設置為true,表示它現在可以被訪問了。舉例來說,當element中已經有了[1,2,3]并且添加到result里后,進行一個pop_back()剩下[1,2]并將visited[2]置為true,然后跳到上一層調用,再pop_back()剩下[1]并將visited[1]置為true,此時for循環i++,此時visited[2]為true,即向element里添加num[2],element變成[1,3],接著再調用遞歸,在下一層因為visited[0]為false,visited[1]為true,element將添加num[1]變成[1,3,2]。
對遞歸不熟的朋友,可以一邊對著代碼,一邊用筆畫一下幾個樹,過幾遍就OK拉!
代碼如下:
1 #include <vector>
2 #include <iostream>
3 using namespace std;
4
5 class Solution {
6 public:
7 vector<vector<int> > permute(vector<int> &num) {
8 vector<vector<int>> result;
9 vector<int> element;
10
11 int len = num.size();
12 bool *visited = new bool[len];
13 memset(visited,false,len);
14
15 helper(num,result,element,visited);
16 return result;
17 }
18
19 private:
20 void helper(vector<int> &num,vector<vector<int>> &result,vector<int> &element,bool *visited){
21 if(element.size() == num.size()){
22 //element中元素和num中元素一樣多,說明得到了一個全排列,放進result里
23 result.push_back(element);
24 return ;
25 }
26
27 for(int i = 0; i < num.size(); i++){
28 if(!visited[i]){
29 visited[i] = true;
30 element.push_back(num[i]);
31 helper(num,result,element,visited);
32
33 element.pop_back();
34 visited[i] = false;
35 }
36 }
37 }
38 };
39
40 int main(){
41 Solution s;
42 vector<int> num;
43 num.push_back(1);
44 num.push_back(2);
45 num.push_back(3);
46 s.permute(num);
47 }
總結
以上是生活随笔為你收集整理的【LeetCode练习题】Permutations的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《大话设计模式》 国外资料
- 下一篇: sql-lib闯关秘籍之21-30关