Leetcode演算法Java全解答--46. 全排列
阿新 • • 發佈:2018-12-10
Leetcode演算法Java全解答–46. 全排列
文章目錄
題目
給定一個沒有重複數字的序列,返回其所有可能的全排列。
示例
輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
想法
將原陣列,最終結果陣列,某次的陣列 進行遞迴
當迴圈到最後一個的時候,就往最終結果陣列 裡面 新增 某次的陣列
如果沒迴圈到最後一個的時候,繼續呼叫原來的歸方法
結果
超過26%的測試案例
時間複雜度/空間複雜度: /n
總結
// TODO
執行過程
result: []smallResult: [] result: []smallResult: [1] result: []smallResult: [1, 2] result: []smallResult: [1, 2, 3] result: [[1, 2, 3]]smallResult: [1, 3] result: [[1, 2, 3]]smallResult: [1, 3, 2] result: [[1, 2, 3], [1, 3, 2]]smallResult: [2] result: [[1, 2, 3], [1, 3, 2]]smallResult: [2, 1] result: [[1, 2, 3], [1, 3, 2]]smallResult: [2, 1, 3] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3]]smallResult: [2, 3] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3]]smallResult: [2, 3, 1] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]smallResult: [3] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]smallResult: [3, 1] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]]smallResult: [3, 1, 2] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2]]smallResult: [3, 2] result: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2]]smallResult: [3, 2, 1]
程式碼
我的答案
/************************************** * 題目 給定一個沒有重複數字的序列,返回其所有可能的全排列。 示例: 輸入: [1,2,3] 輸出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] **************************************/ /************************************* 想法: 將原陣列,最終結果陣列,某次的陣列 進行遞迴 當迴圈到最後一個的時候,就往最終結果陣列 裡面 新增 某次的陣列 如果沒迴圈到最後一個的時候,繼續呼叫原來的歸方法 我的做法 超過26%的測試案例 時間複雜度/空間複雜度: /n 程式碼執行過程: 總結: ************************************/ public List<List<Integer>> permute(int[] nums) { if (nums.length == 0) { return Collections.EMPTY_LIST; } List<List<Integer>> result = new ArrayList<>(); List<Integer> smallResult = new ArrayList<>(); repick(nums, result, smallResult); return result; } private void repick(int[] nums, List<List<Integer>> result, List<Integer> smallResult) { if (smallResult.size() == nums.length) { result.add(new ArrayList<Integer>(smallResult)); } else { for (int i = 0; i < nums.length; i++) { if (smallResult.contains(nums[i])) { continue; } smallResult.add(nums[i]); repick(nums, result, smallResult); smallResult.remove(smallResult.size() - 1); } } }
大佬們的答案
public List<List<Integer>> better(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(nums == null || nums.length == 0) {
return result;
}
List<Integer> list = new ArrayList<Integer>();
permute(nums, result, 0, list);
return result;
}
public void permute(int[] nums, List<List<Integer>> result, int index, List<Integer> list){
if(index == nums.length){
List<Integer> array = new ArrayList<Integer>(list);
result.add(array);
return;
}
for(int i=index;i<nums.length;i++){
swap(nums, index, i);
list.add(nums[index]);
permute(nums, result, index+1, list);
// 當list裡面存的是Integer的時候,刪除Integer傳遞的int引數,是刪除相應位置的元素還是刪除對應的Integer物件
list.remove(list.size()-1);
swap(nums, index, i);
}
}
public void swap(int[] nums, int left, int right){
if(left == right) {
return;
}
nums[left] ^= nums[right];
nums[right] ^= nums[left];
nums[left] ^= nums[right];
}
測試用例
@Test
public void test046() {
// 建立測試案例
int[] arr1 = new int[] { 1, 2, 3 };
// 測試案例期望值
List<List<Integer>> expResult1 = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(3);
list2.add(2);
List<Integer> list3 = new ArrayList<>();
list3.add(2);
list3.add(1);
list3.add(3);
List<Integer> list4 = new ArrayList<>();
list4.add(2);
list4.add(3);
list4.add(1);
List<Integer> list5 = new ArrayList<>();
list5.add(3);
list5.add(1);
list5.add(2);
List<Integer> list6 = new ArrayList<>();
list6.add(3);
list6.add(2);
list6.add(1);
expResult1.add(list1);
expResult1.add(list2);
expResult1.add(list3);
expResult1.add(list4);
expResult1.add(list5);
expResult1.add(list6);
// 執行方法
Solution046 solution046 = new Solution046();
List<List<Integer>> result1 = solution046.permute(arr1);
// 判斷期望值與實際值
Assert.assertEquals(expResult1, result1);
}
其他
程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan
“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改
如有疑問請聯絡,聯絡方式:QQ3060507060