排列组合
1. 全排列
原理:假设要求的是5个数字的全排列,那么就等同于将第一位数字设置好后加上剩余4个数字的全排列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: int vis[30]; void f(int dep, vector<int>&nums,vector<vector<int>>&ans) { if (dep == nums.size()) { ans.emplace_back(nums); return; } for (int i = dep;i < nums.size();i++) { swap(nums[dep],nums[i]); f(dep+1,nums,ans); swap(nums[dep],nums[i]); } } vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>>ans; vector<int>temp; f(0,nums,ans); return ans; } };
|
2. 组合
求解从n个数里面取出k个数字的可能组合
从1开始,后面的数字等于前面的数字,当数到某个数字的时候对其进行+1,如果此时的值大于n,那么此时需要返回到上一个数字,最终就是从后向前不断使用大的数字
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: vector<vector<int>> combine(int n, int k) { vector<vector<int>>ans; vector<int>v(k, 0); int i = 0; while (i >= 0) { v[i]++; if (v[i] > n) i--; else if (i == k-1) ans.push_back(v); else { ++i; v[i] = v[i-1]; } } return ans; } };
|