全排列問題Ⅰ(Java實現)


給定一個沒有重復數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
看到這個題目,我們應該有這樣的思路:
比如就如題【1,2,3】,我們來分析:
  1.定1,來求2,3的全排列
    1.1.定2,來求3的全排列
      1.1.1.只有3了。所以得到的答案為【1,2,3】
    1.2回到剛剛的2,3全排列,因為3排了,2沒有變,所以此時2不得不變,得到的答案是【1,3,2】
  2.定1已經完了,這時候1不得不變了,所以定2,求1,3的全排列
    2.1.定1,來求3的全排列
      2.1.1.只有3了。所以得到的答案為【2,1,3】
    2.2回到剛剛的1,3全排列,因為3排了,1沒有變,所以此時1不得不變,得到的答案是【2,3,1】
  2.定1,2已經完了,這時候1,2不得不變了,所以定3,求1,2的全排列
    2.1.定1,來求2的全排列
      2.1.1.只有2了。所以得到的答案為【3,1,2】
    2.2回到剛剛的1,2全排列,因為2排了,1沒有變,所以此時1不得不變,得到的答案是【3,1,2】
因此最后的答案是【1,2,3】 【1,3,2】 【2,1,3】 【2,3,1】 【3,1,2】 【3,1,2】
我們可以再來一個復雜的例子:

比如:[1,2,4,5]我們要求它的全排列,分析如下:
  1.定1,來求2,4,5的全排列
    1.1.定2,來求4,5的全排列
      1.1.1.定4,求5的全排列,
        1.1.1.1只有5了。所以得出【1,2,4,5】
      1.1.2回到剛才的保持2不變,求4,5的排列。因為4不變過,所以4不能打頭了。故結果為【1,2,5,4】
    1.2.等到2以后的都排列完了后,2不得不變,所以定4,求2,5的全排列
      1.2.1.保持2不變,求5的全排列
        1.2.1.1.只有4了。所以得出【1,4,2,5】

      1.2.2回到剛才的保持4不變,求2,5的排列。因為2不變過,所以2不能打頭了。故結果為【1,4,5,2】
    1.3.等到2.4都定完了后,2,4不得不變,所以定5,求2,4的全排列
      1.2.1.保持2不變,求4的全排列
        1.2.1.1.只有4了。所以得出【1,5,2,4】
      1.2.2回到剛才的保持5不變,求2,4的排列。因為4不變過,所以4不能打了。故結果為【1,5,4,2】
              ..............
 所以以第一個打頭的有 【1,2,4,5】  【1,2,5,4】  【1,4,2,5】 【1,4,5,2】 【1,5,2,4】 【1,5,4,2】
這只是定第一個數字的情況,其他的和這個類似,就不多寫重復的思路了。
          ...........
具體的實現代碼如下:
package edu.ymm.about_permutation;

import java.util.ArrayList;
import java.util.List;

public class Permutation {
	static List<List<Integer>> lists=new ArrayList<>();
    public static List<List<Integer>> permute(int[] nums) {
 
        List<Integer> list=new ArrayList<>();
        if(nums.length==0||nums==null){
            return lists;
        }
        permute(nums,list,0);
        return lists;
    }
 
    private static void permute(int[] nums,  List<Integer> list, int index) {
        //邊界值判斷
    	if(index==nums.length){
            lists.add(new ArrayList<>(list));
            return;
        }
        //i是從開始 i=index ;swap(,i)index相當於固定當前位置,在進行下一位的排列。
        for(int i=index;i<nums.length;i++){
            swap(nums,index,i);   //第一次交換定點之后的
            list.add(nums[index]); //把找到的加進去
            permute(nums,list,index+1); //進行遞歸
            list.remove(list.size()-1); //其中定位定完的需要定后面的數據
            swap(nums,index,i); //這是交換定點的,也就是重新返回上一級進行交換
 
        }
 
    }
 
    private static void swap(int[] nums, int index, int i) {
		int t =nums[index];
		nums[index] = nums[i];
		nums[i] = t;
	}

	public static void main(String[] args){
        int[] nums=new int[]{1,2,3};
        List<List<Integer>> lists=new ArrayList<>();
        lists=permute(nums);
        for(List<Integer> list:lists){
            for(int i:list){
                System.out.print(i+" ");
            }
            System.out.println();
        }
    }
}
 
         

 執行結果為:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM