1. 程式人生 > 實用技巧 >力扣-46-全排列

力扣-46-全排列

傳送門

給定一個沒有重複數字的數列,輸入該數列的全排列。

這是一道回溯法(遞迴思想)的題目,可以通過遞迴來列舉所有的排列組合,為了避免重複使用某個數字,可以用flag標記每個數字是否使用。

程式碼方面,回溯法的框架如下,細品:

result = []
def backtrack(路徑, 選擇列表):
    if 滿足結束條件:
        result.add(路徑)
        return
    
    for 選擇 in 選擇列表:
        做選擇
        backtrack(路徑, 選擇列表)
        撤銷選擇
/*遞迴*/
#include <cstring>
#include 
<string.h> #include <algorithm> using namespace std; class Solution { private: vector<int> path; /*記錄排列的path*/ vector<int> nums; vector<vector<int> > res; /*全排列結果*/ int flag[1005]; public: void dfs(int num){ if (num == 0){ /*num表示差num個數字就形成一個排列
*/ res.push_back(path); return ; } for(int i = 0; i < nums.size(); i++){ if(flag[i]) continue; flag[i] = 1; path.push_back(nums[i]); dfs(num - 1); path.pop_back(); flag[i] = 0; } } vector
<vector<int>> permute(vector<int>& nums) { this->nums = nums; memset(flag, 0, sizeof(flag)); dfs(nums.size()); return res; } };