日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【LeetCode练习题】Permutations

發布時間:2023/12/13 综合教程 38 生活家
生活随笔 收集整理的這篇文章主要介紹了 【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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。