leetcode-46-全排列(permutations)-java
阿新 • • 發佈:2018-12-29
題目及測試
package pid046; import java.util.List; /*全排列 給定一個沒有重複數字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] */ public class main { public static void main(String[] args) { int[] testTable=new int[]{1,2,3,4}; test(testTable); } private static void test(int[] ito) { Solution solution = new Solution(); int length=ito.length; List<List<Integer>> rtn; for(int i=0;i<length;i++){ System.out.print( ito[i]+" "); } System.out.println(); long begin = System.currentTimeMillis(); rtn=solution.permute(ito);//執行程式 long end = System.currentTimeMillis(); for(int i=0;i<rtn.size();i++){ for(int j=0;j<rtn.get(i).size();j++){ System.out.print( rtn.get(i).get(j)+" "); } System.out.println(); } System.out.println(); System.out.println("耗時:" + (end - begin) + "ms"); System.out.println("-------------------"); } }
解法1(成功,8ms,較慢)
在類中建立一個result的變數,放置結果
建立permutateRemain函式,變數為上一次的全排列幾位的list(now)和還能排的數字的list(remain)
在函式中,
如果remain剩餘的量為0,將now加入result
對remain進行遍歷,在遍歷中
遍歷的數字為now
先建立一個對now的copy newlist,將newlist加入now
然後將remain除去now,進行新的permutateRemain,然後在remain重新加入now,結束遍歷
package pid046; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; public class Solution { List<List<Integer>> result=new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { int length=nums.length; if(length==0){ return result; } List<Integer> now=new ArrayList<>(); List<Integer> remain=new ArrayList<>(nums.length); for(int num:nums){ remain.add(num); } permuteRemain(now,remain); return result; } public void permuteRemain(List<Integer> now,List<Integer> remain){ if(remain.size()==0){ result.add(now); return; } List<Integer> newList; for(int i=0;i<remain.size();i++){ Integer num=remain.get(i); remain.remove(i); newList=new ArrayList<>(); newList.addAll(now); newList.add(num); permuteRemain(newList, remain); remain.add(i, num); } } }
解法2(別人的)
省去了不斷copy list的時間,加了判斷now有無這個num的時間
package go.jacob.day819; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 46. Permutations * @author Jacob * 題意:求陣列的全排列 */ public class Demo1 { List<List<Integer>> res; public List<List<Integer>> permute(int[] nums) { res = new ArrayList<List<Integer>>(); if (nums == null || nums.length < 1) return res; //對陣列元素進行從小到大排序 Arrays.sort(nums); ArrayList<Integer> list = new ArrayList<Integer>(); solve(list, nums); return res; } private void solve(ArrayList<Integer> list, int[] nums) { if (list.size() == nums.length) { res.add(new ArrayList<Integer>(list)); return; } for (int i = 0; i < nums.length; i++) { if (!list.contains(nums[i])) { list.add(nums[i]); solve(list, nums); list.remove(list.size() - 1); } } } }
解法3,解法4
字典序 的非遞迴全排列
遞迴的交換全排列
http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html
https://segmentfault.com/a/1190000007067885