排列组合
 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;     } };
  |