力扣-46-全排列
阿新 • • 發佈:2020-07-12
給定一個沒有重複數字的數列,輸入該數列的全排列。
這是一道回溯法(遞迴思想)的題目,可以通過遞迴來列舉所有的排列組合,為了避免重複使用某個數字,可以用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; } };