Leetcode 46 Permutations 全排列,給定不重複的幾個數字,輸出他們所有的排列
阿新 • • 發佈:2019-02-17
這道題的最簡單的思路就是,我後面的在前面的基礎上,從左到右依次換位置插入。
題目:
給定一個沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
我的較笨解決辦法:
package test; import java.util.ArrayList; import java.util.List; public class LC46Try1 { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> ret = new ArrayList<List<Integer>>(); int len=nums.length; if(len==0){ return ret; } List<Integer> list=new ArrayList<Integer>(); list.add(nums[0]); ret.add(list); for(int i=1;i<len;i++){ int t=nums[i]; List<List<Integer>> temp = new ArrayList<List<Integer>>(); for(int j=0;j<ret.size();j++){ List<Integer> tlist=ret.get(j); for(int k=0;k<=tlist.size();k++){ List<Integer> lt=new ArrayList<Integer>(tlist); lt.add(k, t); temp.add(lt); } } ret=temp; } return ret; } public static void main(String[] args) { LC46Try1 t = new LC46Try1(); int[] nums={1,2,3}; System.out.println(t.permute(nums)); } }
較好的解決辦法:
package test; import java.util.ArrayList; import java.util.List; public class LC46Try2 { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new ArrayList<List<Integer>>(); List<Integer> list=new ArrayList<Integer>(); backtracking(result, list, nums, 0); return result; } private void backtracking(List<List<Integer>> result, List<Integer> temp, int[] nums, int index) { if (index==nums.length){ result.add(new ArrayList<Integer>(temp)); return; } //就相當於最後一個for迴圈,時間可能短在 list的複製上 for (int i=0; i<=index; i++){ temp.add (i, nums[index]); backtracking (result, temp, nums, index+1); temp.remove (i); } } }
哈哈