1. 程式人生 > >【LeetCode】96. Permutations

【LeetCode】96. Permutations

題目描述(Medium)

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

題目連結

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>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<int> path;
        vector<vector<int>> result;
        dfs(nums, path, 0, result);
        return result;
    }
    
    void dfs(vector<int>& nums, vector<int>& path, 
                 int step, vector<vector<int>> &result) {
        if (step == nums.size())
        {
            result.push_back(path);
            return;
        }
        int firstSame = step;
        while (firstSame >= 0 && nums[step] == nums[firstSame])
            --firstSame;
        int sameNum = step - firstSame - 1;
        if (sameNum == 0 || (path.size() >= sameNum 
                             && path[path.size()- sameNum] == nums[step])) {
            // 考慮S[i]
            path.push_back(nums[step]);
            dfs(nums, path, step + 1, result);
            path.pop_back(); 
        }
        // 不考慮S[i]
        dfs(nums, path, step + 1, result);
    }

};

提交程式碼(方法二):

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;
    }
};