給定一個數字列表,返回其所有可能的排列。 注意事項 你可以假設沒有重複數字。
Lintcode 15 全排列
給定一個數字列表,返回其所有可能的排列。
注意事項
你可以假設沒有重複數字。
思路:思路:n個數字額全排列等於將最後一個數字k插入前n-1個數的全排列中,
這就是遞迴思想
int型別的nums陣列作為輸入1.當只有一個數時輸出這個數的排列
2.否則將這個nums的前n-1個數賦值到array陣列中
3.遞迴呼叫返回排列,本程式碼中返回List
4.對List中的每一個排列構造全排列
public class Solution {
/*
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public List<List<Integer>> permute(int[] nums) {
//用來存放nums前n-1個數
int[] array=null;
//n表示nums陣列的最後一個數
int n = 0;
//array陣列的長度
int array_len = nums.length-1;
List<Integer> num = new ArrayList<Integer>();
List<List<Integer>> list = new ArrayList<List<Integer>>();
if(nums==null||nums.length==0){
list.add(num);
return list;
}
//當只有一個數時,輸出這個排列
if(nums.length==1){
num.add(nums[0]);
list.add(num);
return list;
}else{
//將這n個數的前n-1個數存到array陣列中
array = new int[array_len];
for(int i = 0;i<array_len;i++){
array[i]=nums[i];
}
//遞迴呼叫函式返回全排列的List
list = permute(array);
//size表示第n個數插入前list的大小
int size = list.size();
//對list中的每一個排列構造全排列
for(int j=0;j<size;j++){
//num表示list中的一個排列
num = list.get(j);
//num_size表示list的一個排列也就是num的大小
int num_size = num.size();
//將第n個數插入到前n-1個數的各個不同的位置,從0到num_size
for(int k = 0;k<=num_size;k++){
//不能直接賦值,否則temp是num的引用,對temp的操作也就是對num的操作
List<Integer> temp = new ArrayList<Integer>(num);
// List<Integer> temp = new ArrayList<Integer>();
//temp.addAll(num);
n = nums[array_len];
temp.add(k,n);
list.add(temp);
}
}
//第n個數插入到前n-1個排列之後夠成n個數的全排列,要移除插入前的排列,每次移除首位
for (int i = 0; i < size; i++) {
list.remove(0);
}
return list;
}
}
}
當有重複的全排列時,只要在list.add(temp);做如下修改即可
if(list.contains(temp))
continue;
else
list.add(temp);
版權所有:轉載請註明出處!