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]
]
题目解析:
就是高中学习的排列组合,给定几个数字,求出所有的组合形式;
解法思路:
高中数学解法:假设三个数字就是三个坑,第一个坑可以有三种选择,第二个坑只有二种选择,最后就只有一种选择啦,这就不多解释啦,基础数学,学过的都知道!
回归至代码逻辑:首先可以用递归法,第一次往链表(Java中采用List)添加一个元素,有n中可能,然后将剩下的元素再添加一个元素到链表中,有n-1种可能,以此类推,直至链表中的元素大小等于数组大小。
代码:
@Test
public void TestPermute()
{
int[] nums = new int[]{1,2,3};
permuteSolution solution = new permuteSolution();
solution.permute(nums);
}
public class permuteSolution {
public List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
result.clear();
permutation(nums, new ArrayList());
System.out.println(result);
return result;
}
public void permutation(int[] nums,List<Integer> list)
{
if(list.size() == nums.length)
{
result.add(list);
return;
}
for(int i = 0;i < nums.length;i++)
{
if(!list.contains(nums[i]))
{
List<Integer> temp = new ArrayList<Integer>(list);
//这里一定得将list赋值给temp,否则会死循环,栈空间会爆掉,产生stackoverflowerror
temp.add(nums[i]);
permutation(nums,temp);
}
}
}
}
注意点:
1.求解的排列组合,当元素个数与给定数组相等时,即为一个解;
2.一定得将list(所求解)赋值给暂存temp(临时解),不然会出现死循环,此处是为了记录哪些已经加入进所求解中。
性能:
总结:
这题使用Java允许时间效率很高,继续加油!