【道德经·第三十五章】执大象,天下往。往而不害,安平太。乐与饵,过客止,道之出口,淡乎其无味,视之不足见,听之不足闻,用之不足既。
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| vector<vector<int> > permute(vector<int>& nums) { vector<vector<int> > res; vector<int> out; int n = nums.size(); bool *visted = new bool[n]; fill(visted, visted+n, false); dfs(nums, res, out, visted); return res; } void dfs(vector<int>& nums, vector<vector<int> >& res, vector<int>& out, bool* visted) { if(out.size() == nums.size()) { res.push_back(out); return; } for(int i = 0; i < nums.size(); i++) { if(visted[i] == true) continue; out.push_back(nums[i]); visted[i] = true; dfs(nums, res, out, visted); visted[i] = false; out.pop_back(); } }
|
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| void dfs(vector<int>& nums, bool* visted, vector<int>& cur, vector<vector<int> >& res) { if(cur.size() >= nums.size()) { res.push_back(cur); return; }
for(int i = 0; i < nums.size(); ++i) { if(visted[i] || (i>0 && nums[i]==nums[i-1] && visted[i-1]==false)) continue; vis[i] = 1; cur.push_back(nums[i]); dfs(nums, visted, cur, res); cur.pop_back(); vis[i] = 0; } }
vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int> > res; vector<int> cur;
if(nums.empty()) return res;
sort(nums.begin(), nums.end()); int n = nums.size(); bool *visted = new bool[n]; fill(visted, visted+n, false); dfs(nums, visted, cur, res); return res; }
|
给你一个整数数组 nums ,找出 nums 的下一个排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| void nextPermutation(vector<int>& nums) { int n = nums.size(); int i; for(i = n-1; i > 0; i--) { if(nums[i] > nums[i-1]) { break; } } if(i == 0) { reverse(nums.begin(), nums.end()); return; } int j; for(j = n-1; j >= i; j--) { if(nums[j] > nums[i-1]) { swap(nums[j], nums[i-1]); break; } } sort(nums.begin()+i, nums.end()); }
|
输入一个长度为 n 字符串,打印出该字符串中字符的所有排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| vector<string> Permutation(string str) { int n = str.size(); vector<string> res; string cur; bool *visited = new bool[n]; fill(visited, visited+n, false); sort(str.begin(), str.end()); dfs(str, res, cur, visited); return res; }
void dfs(string& str, vector<string>& res, string& cur, bool* visited) { if(cur.size() == str.size()) { res.push_back(cur); return; } for(int i = 0; i < str.size(); i++) { if(visited[i] == true) continue; if(i>0 && str[i]==str[i-1] && visited[i-1]==false) continue; visited[i] = true; cur.push_back(str[i]); dfs(str, res, cur, visited); cur.pop_back(); visited[i] = false; } }
|
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| vector<vector<int>> combine(int n, int k) { vector<vector<int>> res; vector<int> out; dfs(n, k, res, out, 1); return res; }
void dfs(int n, int k, vector<vector<int>>& res, vector<int>& out, int start) { if(out.size() == k) { res.push_back(out); return; } for(int i = start; i <= n; i++) { out.push_back(i); dfs(n, k, res, out, i+1); out.pop_back(); } }
|
找出nums(无重复)中可以使数字和为目标数target的所有不同组合。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| vector<vector<int>> combinationSum(vector<int>& nums, int target) { vector<vector<int>> res; vector<int> out; dfs(nums, target, res, out, 0); return res; }
void dfs(vector<int>& nums, int target, vector<vector<int>>& res, vector<int>& out, int start) { if(target < 0) return; if(target == 0) { res.push_back(out); return; } for(int i = start; i < nums.size(); i++) { out.push_back(nums[i]); dfs(nums, target-nums[i], res, out, i); out.pop_back(); } }
|
组合总和带重复元素。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| vector<vector<int> > combinationSum2(vector<int>& candidates, int target) { vector<vector<int> > res; vector<int> out; sort(candidates.begin(), candidates.end()); dfs(candidates, target, res, out, 0); return res; }
void dfs(vector<int>& candidates, int target, vector<vector<int> >& res, vector<int>& out, int start) { if(target < 0) return; if(target == 0) { res.push_back(out); return; } for(int i = start; i < candidates.size(); i++) { if(i>start && candidates[i]==candidates[i-1]) continue; out.push_back(candidates[i]); dfs(candidates, target-candidates[i], res, out, i+1); out.pop_back(); } }
|
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:1、只使用数字1到9每个数字;2、最多使用一次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| vector<vector<int>> combinationSum3(int k, int n) { vector<vector<int> > res; vector<int> out; dfs(k, n, res, out, 1); return res; }
void dfs(int k, int n, vector<vector<int> >& res, vector<int>& out, int start) { if(n < 0) return; if(n==0 && out.size()==k) { res.push_back(out); return; } for(int i = start; i <= 9; i++) { out.push_back(i); dfs(k, n-i, res, out, i+1); out.pop_back(); } }
|
从不同整数组成的数组nums中找出并返回总和为 target 的元素组合的个数。
1 2 3 4 5 6 7 8 9 10 11 12 13
| int combinationSum4(vector<int>& nums, int target) { vector<int> dp(target+1); dp[0] = 1; for (int i = 1; i <= target; i++) { for (int num : nums) { if (num<=i && dp[i-num]<INT_MAX-dp[i]) dp[i] += dp[i-num]; } } return dp[target]; }
|
位我上者,灿烂星空;道德律令,在我心中。