46. 全排列 ----- 回溯递归算法、交换函数

46. 全排列

难度中等

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

 

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

 

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同
    class Solution {
    public:    
        void backtrack(vector<vector<int>> & res, vector<int>& nums, int start ) {
          int n = nums.size();
          if (start == n) {
              res.emplace_back(nums);
              return;
          }
          for (int i = start; i < n; ++i) {
              swap(nums[start], nums[i]);
              backtrack(res, nums, start+1);
              swap(nums[start], nums[i]);
          }  
        }
    
        vector<vector<int>> permute(vector<int>& nums) {
            vector<vector<int>> res;
            backtrack(res, nums, 0);
            return res;
        }
    };

     

     不使用交换函数:

  • class Solution {
    public:
        vector<vector<int>> result;
        vector<int> path;
        void backtracking (vector<int>& nums, vector<bool>& used) {
            // 此时说明找到了一组
            if (path.size() == nums.size()) {
                result.push_back(path);
                return;
            }
            for (int i = 0; i < nums.size(); i++) {
                if (used[i] == true) continue; // path里已经收录的元素,直接跳过
                used[i] = true;
                path.push_back(nums[i]);
                backtracking(nums, used);
                path.pop_back();
                used[i] = false;
            }
        }
        vector<vector<int>> permute(vector<int>& nums) {
            result.clear();
            path.clear();
            vector<bool> used(nums.size(), false);
            backtracking(nums, used);
            return result;
        }
    };

     

posted @ 2022-11-15 18:58  slowlydance2me  阅读(20)  评论(0编辑  收藏  举报