【LeetCode】96. Permutations

题目描述(Medium)

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

题目链接

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

Example 1:

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

算法分析

方法一:dfs解法,每次从左到右,选一个没有出现过的元素,当走到最后一个元素时则返回。时间复杂度O(n!),空间复杂度O(n)

方法二:自己实现next_permutation(),详见【LeetCode】12.Next Permutation,时间复杂度O(n!),空间复杂度O(1)

提交代码(方法一):

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> path;
        dfs(nums, path, result);
        
        return result;        
    }
    
    void dfs(vector<int>& nums, vector<int>& path, 
             vector<vector<int>>& result) {
        if (path.size() == nums.size())
        {
            result.push_back(path);
            return;
        }
        
        for (auto i : nums)
        {
            auto pos = find(path.begin(), path.end(), i);
            if (pos == path.end())
            {
                path.push_back(i);
                dfs(nums, path, result);
                path.pop_back();                
            }
        }
    } 
};

提交代码(方法二):

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        do
        {
            result.push_back(nums);
        } while(next_permutations(nums));
        
        return result;
    }
    
    bool next_permutations(vector<int>& nums)
    {
        auto rfirst = nums.rbegin();
        auto rlast = nums.rend();
        
        auto pivot = rfirst + 1;
        while (pivot != rlast && *pivot > *(pivot - 1))
            ++pivot;
        
        if (pivot == rlast)
            return false;
        
        auto onchange = find_if(rfirst, pivot, bind1st(less<int>(), *pivot));
        
        swap(*pivot, *onchange);
        reverse(rfirst, pivot);
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/ansizhong9191/article/details/83023987
今日推荐