代碼題(19)— 組合與排列
阿新 • • 發佈:2018-07-11
dfs tro 個數字 == site back sum 函數 寫法
1、77. 組合
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。
示例:
輸入: n = 4, k = 2 輸出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; vector<int> temp; combSum(n, k,1, temp, res); return res; } void combSum(int n, int k, int pos, vector<int> &temp, vector<vector<int>> &res) { if(temp.size() == k) { res.push_back(temp); return; } for(int i=pos;i<=n;++i) { temp.push_back(i); combSum(n,k,i+1,temp,res); temp.pop_back(); } } };
2、46. 全排列
給定一個沒有重復數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
(1)這道題是求全排列問題,給的輸入數組沒有重復項,這跟之前的組合和類似,解法基本相同,但是不同點在於那道不同的數字順序只算一種,是一道典型的組合題,而此題是求全排列問題,還是用遞歸DFS來求解。這裏我們需要用到一個visited數組來標記某個數字是否訪問過,然後在DFS遞歸函數從的循環應從頭開始,而不是從level開始,這是和組合不同的地方,其余思路大體相同。
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; vector<int> temp; vector<int> visited(nums.size(),0); permuteDfs(nums,0,visited,temp,res); return res; } void permuteDfs(vector<int> &nums, int pos, vector<int> &visited, vector<int> &temp, vector<vector<int>> &res) { if(pos == nums.size()) res.push_back(temp); else { for(int i=0;i<nums.size();++i) { if(visited[i] == 0) { visited[i] = 1; temp.push_back(nums[i]); permuteDfs(nums,pos+1,visited,temp,res); temp.pop_back(); visited[i] = 0; } } } } };
(2)還有一種遞歸的寫法,更簡單一些,這裏是每次交換num裏面的兩個數字,經過遞歸可以生成所有的排列情況。
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; permuteDfs(nums, 0, res); return res; } void permuteDfs(vector<int> &nums, int pos, vector<vector<int>> &res) { if(pos == nums.size()) res.push_back(nums); for(int i=pos;i<nums.size();++i) { swap(nums[pos], nums[i]); permuteDfs(nums, pos+1, res); swap(nums[pos], nums[i]); } } };
代碼題(19)— 組合與排列