1. 程式人生 > >46. Permutations(python+cpp)

46. Permutations(python+cpp)

題目:

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

解釋:
經典的回溯法的題目,其實可以直接用itertools.permutations

from itertools import permutations
class Solution
: def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ return list(permutations(nums,len(nums)))

正規的寫法還是dfs。
將整組數中的所有的數分別與第一個數交換,這樣就總是在處理後n-1個數的全排列。
python程式碼:

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
self.result=[] self.n=len(nums) def dfs(nums,curfirst): if curfirst==self.n: self.result.append(nums[:]) for i in range(curfirst,self.n): nums[curfirst],nums[i]=nums[i],nums[curfirst] dfs(nums,curfirst+1
) nums[curfirst],nums[i]=nums[i],nums[curfirst] dfs(nums,0) return self.result

c++程式碼:

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

總結:
c++不需要像python那樣再拷貝一個list出來再append到result裡面,與python淺拷貝的性質有關。