Permutations

Given a list of numbers, return all possible permutations and no duplicate.

Example

For nums = [1,2,3], the permutations are:

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

解题分析:

首先根据题的规律,可以看出,首先1 开始的组合,然后2开始的组合,然后3 开始的组合,可以利用DFS的方法进行解题,DFS解题技巧,例如结果是求出一个数组的列表,那么DFS的退出条件就是当前current的数组等于给定数组的长度,这时把这个current 加入结果集合中,然后就是DFS 的循环,首先每次都是从头到尾的循环数组中的每一个元素,由于数组中的元素不重复,所以非常简单的可以使用,nums[i] not in current 来跳过已经添加的数组。如果给定的nums数组如果有重复,这样需要另外的方法去解题,同时容易犯错的地方,不要直接使用current 数组,每次复制一个然后添加到result里面,如果直接使用current数组,当删除的时候,会把它整个删除掉。

重要的理解, 必须深刻理解DFS的递归树,

current 初始化的值[]

current =[]

                   []
          1         2         3
     12      13  23   21   31    32
   123      132  231  213  312   321  result.append()
class Solution:
    """
    @param nums: A list of Integers.
    @return: A list of permutations.
    """
    def permute(self, nums):
        # write your code here
        if nums == None:
            return []
        result = []
        self.dfs(result, [], nums)
        return result

    def dfs(self, result, current, nums):
        if len(current) == len(nums):
            result.append(list(current))
            return
        for i in range(len(nums)):
            if nums[i] not in current:
                current.append(nums[i])
                self.dfs(result, current, nums)
                del current[-1]
public class Solution {
    public IList<IList<int>> result = new List<IList<int>>();

    public IList<IList<int>> Permute(int[] nums) {

        IList<int> current = new List<int>();

        DFS(nums, result, current);

        return result;

    }

    public void DFS(int[] nums, IList<IList<int>> result, IList<int> current){

        if(current.Count == nums.Length){

            result.Add(new List<int>(current));

            return;
        }

        for(int i = 0; i < nums.Length;i++){
            if(!current.Contains(nums[i])){
                current.Add(nums[i]);
                DFS(nums, result, current);
                current.RemoveAt(current.Count - 1);
            }

        }
    }
}

Last updated

Was this helpful?