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