Leetcode - 046 Permutationssegmentfault
全排列問題是回溯的典型例題:
1.可行解的組成形式是給定數組中的全部數的組合,故而大小上能夠做爲可行解斷定條件
2.每次須要在剩下可被選中的集合中選擇一個,建立mask數組數組
class Solution { public: void dfs(vector<vector<int>> &vct, vector<int> &cur, vector<int>& nums,vector<int> & used) { if (cur.size() == nums.size()) { vct.push_back(cur); return; } for (int i = 0; i < nums.size(); ++i) { if (used[i] == 0) { cur.push_back(nums[i]); used[i] = 1; dfs(vct, cur, nums, used); used[i] = 0; cur.pop_back(); } } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> vct; int n = nums.size(); if (n <= 0) return vct; vector<int> cur; vector<int> used(n, 0); dfs(vct, cur, nums, used); return vct; } };
Leetcode - 047. Permutations IIcode
diff : 須要考慮val1 = val2 的狀況,須要sort將相同元素聚類,而後能夠參考前文 Leetcode - 040. Combination Sum II 去重的方法ip
class Solution { public: void dfs(vector<vector<int>> &vct, vector<int> &cur, vector<int>& nums, vector<int> & used) { if (cur.size() == nums.size()) { vct.push_back(cur); return; } for (int i = 0; i < nums.size(); ++i) { if (used[i] == 0) { int pre_index = i - 1; bool repeated = false; while (pre_index >= 0 && nums[pre_index] == nums[i]) { if (used[pre_index] == 0) { repeated = true; break; } --pre_index; } if (repeated) continue; cur.push_back(nums[i]); used[i] = 1; dfs(vct, cur, nums, used); used[i] = 0; cur.pop_back(); } } } vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int>> vct; vector<int> cur; int n = nums.size(); if (n <= 0) return vct; vector<int> used(n, 0); dfs(vct, cur, nums, used); return vct; } };