Blog of CodeJELLOW’S ENGINEERING NOTES
← 返回文章

46.47.全排列问题

仅作一个记录,方便n刷整理思路。讲解比我写的详细就不再赘述了。 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 详…

本文目录 ⌄

    仅作一个记录,方便n刷整理思路。讲解比我写的详细就不再赘述了。

    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    示例:

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

    详细讲解

    TEXT
    class Solution {
     public:
      vector<vector<int>> ans;
      vector<vector<int>> permute(vector<int>& nums) {
        dfs(0, nums);
        return ans;
      }
      void dfs(int index, vector<int>& output) {
        if (index == output.size()) {
          ans.push_back(output);
          return;
        }
        for (int i = index; i < output.size(); i++) {
          swap(output[i], output[index]);
          dfs(index + 1, output);
          swap(output[i], output[index]);
        }
      }
    };

    47.全排列Ⅱ

    给定一个可包含重复数字的序列,返回所有不重复的全排列。

    示例:

    输入: [1,1,2]
    输出:
    [
    [1,1,2],
    [1,2,1],
    [2,1,1]
    ]

    这里多一个set剪枝,实现无重复。

    TEXT
    class Solution {
    public:
        vector<vector<int>> permuteUnique(vector<int>& nums) {
            if (nums.empty())   return {};
            traceBack(nums, 0);
            return result;
        }
        void traceBack(vector<int>& nums, int begin)
        {
            if (begin == nums.size())
            {   
                result.push_back(nums);
                return;
            }
            unordered_set<int> used;
            for (int i = begin; i < nums.size(); i++)
            {   
                if (used.find(nums[i]) != used.end())   continue;
                used.insert(nums[i]);
                swap(nums[begin], nums[i]);
                traceBack(nums, begin + 1);
                swap(nums[begin], nums[i]);
            }
        }
        vector<vector<int>> result;
    };
    通过 RSS 订阅更新 →