Leetcode OJ 46. Permutations [Medium]
题目描述:
Given acollection 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] ]
题目理解:
给定一个集合/数组,里面的数字是不重复的,返回这些数字的所有排列。
测试用例:
功能测试:输入的数组里有2个、3个、多个数字;
边界测试:输入的数组是null;输入的数组里有1个数字;
分析:
1. 第1个数字不变,后面的数字全排列;第2个数字与第1个数字交换,第一个数字不变,后面的数字全排列,排列完后交换回来;第k个数字与第1个数字交换,第1个数字不变,后面的数字全排列,排列完后交换回来;依次这样循环,直到最后一个数字也完成交换、求全排列、交换;
2. 递归到最深时,剩下一个数字,也就是求一个数字的全排列时,这时整个数组就是一个排列,加入到list中;
解答:
class Solution {
public List<List<Integer>>permute(int[] nums) {
List<List<Integer>>list = new ArrayList();
if(nums.length == 0){
List<Integer> temp = new ArrayList();
list.add(temp);
}
getPermute(list,nums,0,nums.length - 1);
return list;
}
static public void getPermute(List<List<Integer>> list, int[] nums,int start, int end){
if(start== end){
List<Integer> temp = new ArrayList();
for(int i = 0; i < nums.length;i++){
temp.add(nums[i]);
}
list.add(temp);
}
else{
for(int i = start; i <= end; i++){
swap(nums,start,i);
getPermute(list,nums,start+1,end);
swap(nums,start,i);
}
}
}
static public void swap(int[] nums, int start,int end){
int temp =nums[start];
nums[start] = nums[end];
nums[end] = temp;
}
}