1. 程式人生 > >LeetCode 46. Permutations

LeetCode 46. Permutations

oss win col following lee ble ssi ont follow

原題

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

For example,
[1,2,3] have the following permutations:

[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

解題思路

遞歸:遞歸的方法,創建一個visit判斷此值是否已經添加過,每一層不斷地循環,加入沒有被訪問的元素,直到最後結果的長度滿足要求加入答案中

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if nums == None:
            return []
        visit = [0 for i in range(len(nums))]
        self.ret = []
        self._permute(nums, visit, 0, [])
        return self.ret
        
    def _permute(self, nums, visit, count, ret):
        if count == len(nums):
            self.ret.append(ret)
            return
        for i in xrange(len(nums)):
            if visit[i] == 0:
                # ret += [nums[i]]  容易出錯,如果加入這句後面需要還原,不然影響後面的循環
                visit[i] = 1
                self._permute(nums, visit, count+1, ret+[nums[i]])
                visit[i] = 0

非遞歸:跟之前求subsets的思路類似(不過這個是求重復項,sbusets是求非重復),也是從一個個元素一層層加上去,只不過加入結果的時候必須滿足長度要求

class Solution(object):
    def permute(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if nums is None:
            return []
        result = []
        self.helper(nums, [], result)
        return result

    def helper(self, List, path, result):
        if len(path) == len(List):
            result.append(path)
            return
        
        # 跟subsets思路差不多,不過這個是重復,sbusets是非重復
        # 也是從一個個元素一層層加上去,只不過加入結果的時候必須滿足長度要求
        for i in range(len(List)):
            # 不重復加入同一元素
            if List[i] in path:
                continue
            # path.append(List[i])
            self.helper(List, path + [List[i]], result)
            # path.pop()

  

LeetCode 46. Permutations