46. 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]
]

AC code:

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

Runtime: 12 ms, faster than 42.11% of C++ online submissions for Permutations.


2021-05-05

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

示例:

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

思路:回溯法,用到了两个辅助空间,比较容易理解。之前的解法确实很厉害,直接利用交换变量的方法来求解,然后再回溯,不太容易想得到。

Code:

class Solution {
private:
    vector<vector<int> > ans;
    int len;
public:
    void DFS(vector<int>& nums, vector<bool>& visited, vector<int>& temp, int count) {
        if (count == len) {
            ans.push_back(temp);
            return;
        }
        for (int i = 0; i < len; ++i) {
            if (!visited[i]) {
                visited[i] = true;
                temp[count] = nums[i];
                DFS(nums, visited, temp, count+1);
                // 回溯
                visited[i] = false;
            }
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        len = nums.size();
        vector<bool> visited(len+1, false);
        vector<int> temp(len);
        DFS(nums, visited, temp, 0);
        return ans;
    }
};    
永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/9803222.html