1. 程式人生 > >Leetcode演算法Java全解答--46. 全排列

Leetcode演算法Java全解答--46. 全排列

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