leetcode46.Permutation

Posted 妖域大都督

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
};

 

以上是关于leetcode46.Permutation的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-面试算法经典-Java实现106-Construct Binary Tree from Inorder and Postorder Traversal(构造二叉树II)(示例(代码片

LeetCode 5276. 不浪费原料的汉堡制作方案 Number of Burgers with No Waste of Ingredients

leetcode 698 集合k划分

LeetCode Minimum Path Sum

Android Adapter代码片

代码片|水波纹