全排列 leetcode java_LeetCode--046--全排列(java)
給定一個沒有重復數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
無奈,用swap的方法從左向右滑動,直到最后結果和最初的一致停止,只適用于三位數。。。。(改進一下讓每個數字作為第一位后面的進行滑動,應該可以pass,放棄)
錯:
1 classSolution {2 public static void swap(int[] nums_,int a,intb){3 int temp =nums_[a];4 nums_[a] =nums_[b];5 nums_[b] =temp;6 }7 public static boolean isEqual(int[] a,int[] b){8 for(int i = 0;i < a.length;i++){9 if(a[i] != b[i])return false;10 }11 return true;12 }13 public List> permute(int[] nums) {14 List> res = newArrayList();15 List lists = newArrayList();16 if(nums.length < 2){17 lists.add(nums[0]);18 res.add(lists);19 returnres;20 }21 int[] nums_ = new int[nums.length];22 for(int k = 0;k < nums.length;k++){23 nums_[k] =nums[k];24 lists.add(nums[k]);25
26 }27 res.add(newArrayList(lists));28 lists.removeAll(lists);29 swap(nums_,0,1);30 for(int j = 0;j < nums.length;j++){31 lists.add(nums_[j]);32 }33 res.add(newArrayList(lists));34 int i = 1;35 while(!isEqual(nums,nums_)){36 if(i+1
53 }
正確做法bt: ?添加順序就是[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2],
[2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 1], [2, 4, 1, 3], [2, 4, 3, 1],
[3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [3, 4, 2, 1],
[4, 1, 2, 3], [4, 1, 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]
TIME:O(N!*N)(整體來說)
SPACE:O(N)
1 classSolution {2
3 public List> permute(int[] nums) {4 List> res = new ArrayList<>();5 if(nums== null || nums.length ==0)returnres;6 helper(res,new ArrayList<>(),nums);7 returnres;8 }9 public void helper(List> res,List list,int[] nums){10 if(list.size() ==nums.length){11 res.add(new ArrayList<>(list));12 return;13 }14 for(int i = 0;i < nums.length;i++){15 if(list.contains(nums[i]))continue;//contaisn的時間復雜度為O(N)16 list.add(nums[i]);17 helper(res,list,nums);18 list.remove(list.size()-1);19 }20 }21
22 }
如果遞歸符合T(n) = T(n-1)+T(n-2)+....T(1)+T(0) ?時間復雜度基本符合O(2^n),如果在其中的一些步驟可以省略,則可以簡化為O(n!)
對于方法1思想的完善:
TIME:O(N)
SPACE:O(N)
1 classSolution {2
3 public List> permute(int[] nums) {4 List> res = new ArrayList<>();5 if(nums.length == 0 || nums == null)returnres;6 helper(res,0,nums);7 returnres;8 }9 public void helper(List> res,int start,int[] nums){10 if(start ==nums.length){11 List list = new ArrayList<>();12 for(intq:nums){13 list.add(q);14 }15 res.add(new ArrayList<>(list));16 return;17 }18 for(int i = start;i < nums.length;i++){19 swap(nums,start,i);20 helper(res,start+1,nums);21 swap(nums,start,i);22 }23
24 }25 public void swap(int[] nums,int l,intm){26 int temp =nums[l];27 nums[l] =nums[m];28 nums[m] =temp;29 }30
31 }
2019-05-04?10:45:10
總結
以上是生活随笔為你收集整理的全排列 leetcode java_LeetCode--046--全排列(java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java poi jar maven_使
- 下一篇: java excel 复杂表头_中国式复