leetcode46.Permutation

问题描述:

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

思路:

本题中给出的数组中不包含重复数组,所以相对简单。

可以使用DFS来寻找,同时使用visited数组进行辅助。

代码:

class Solution {
public:
    void permuteDFS(vector<int> &pm, vector<int> &visited, vector<vector<int>> &res, vector<int> &num){
        if(pm.size() == num.size()){
            res.push_back(pm);
            return;
        }
        for(int i = 0; i < num.size(); i++){
            if(visited[i])
                continue;
            visited[i] = 1;
            pm.push_back(num[i]);
            permuteDFS(pm, visited, res, num);
            pm.pop_back();
            visited[i] = 0;
        }
    }
    
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> ret;
        vector<int> pm;
        vector<int> visited(nums.size(), 0);
        for(int i = 0; i < nums.size(); i++){
            visited[i] = 1;
            pm.push_back(nums[i]);
            permuteDFS(pm, visited, ret, nums);
            pm.pop_back();
            visited[i] = 0;
        }
        return ret;
    }
    
};

另一种思路:

在别的大神那里看到了一种用swap的很巧妙的方法

假设nums为{1, 2, 3}

从第一个位置开始,我们找第一个位置是1的所有可能, 第一个位置是二的所有可能,第一个位置是三的所有可能

当第一个位置确定之后,我们可以去找第二个位置确定的所有可能。

依次递归。

代码:

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

猜你喜欢

转载自www.cnblogs.com/yaoyudadudu/p/9091697.html