1. 程式人生 > >給定一個數字列表,返回其所有可能的排列。 注意事項 你可以假設沒有重複數字。

給定一個數字列表,返回其所有可能的排列。 注意事項 你可以假設沒有重複數字。

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);

版權所有:轉載請註明出處!