46. Permutations**

46. Permutations**

https://leetcode.com/problems/permutations/

题目描述

Given a collection of distinct integers, return all possible permutations.

Example:

Input: [1,2,3]
Output:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

C++ 实现 1

通过和 nums[start ... N - 1] 这个子序列中的首位进行 swap, 可以一次访问数组中的每一个值.

class Solution {
private:
    void dfs(vector<int> &nums, int start, vector<int> &cur, vector<vector<int>> &res) {
        if (cur.size() == nums.size()) {
            res.push_back(cur);
            return;
        }
        for (int i = start; i < nums.size(); ++ i) {
            std::swap(nums[i], nums[start]);
            cur.push_back(nums[start]);
            dfs(nums, start + 1, cur, res);
            std::swap(nums[i], nums[start]);
            cur.pop_back();
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        vector<int> cur;
        dfs(nums, 0, cur, res);
        return res;
    }
};

C++ 实现 2

C++ 实现 1 中发现 cur 其实可以不需要, 用 nums 自身进行 swap 也是可行的.

class Solution {
private:
    void dfs(vector<int> &nums, int start, vector<vector<int>> &res) {
        if (start == nums.size()) {
            res.push_back(nums);
            return;
        }
        // 第二个 swap 相当于回溯
        for (int i = start; i < nums.size(); ++ i) {
            std::swap(nums[i], nums[start]);
            dfs(nums, start + 1, res);
            std::swap(nums[i], nums[start]);
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        dfs(nums, 0, res);
        return res;
    }
};

C++ 实现 3

另一种做法, 写出这种解法是为了求解 47 题 Permutations II 方便. 注意到, dfs 中的 nums 是拷贝而不是使用引用, 另外, dfs 后面的 swap 去掉了.

class Solution {
private:
	void dfs(vector<vector<int>> &res, vector<int> nums, int begin) {
        if (begin == nums.size()) {
            res.push_back(nums);
            return;
        }
        for (int i = begin; i < nums.size(); ++i) {
            std::swap(nums[i], nums[begin]);
            dfs(res, nums, begin + 1);
        }
	}
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        dfs(res, nums, 0);
        return res;
    }
};
发布了227 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Eric_1993/article/details/103916342