1. 程式人生 > 其它 >78. 子集(java實現)--LeetCode

78. 子集(java實現)--LeetCode

技術標籤:遞迴算髮題位運算演算法題leetcode資料結構演算法java

文章目錄

題目:

給你一個整數陣列 nums ,陣列中的元素 互不相同 。返回該陣列所有可能的子集(冪集)。

解集 不能 包含重複的子集。你可以按 任意順序 返回解集。

示例 1:

輸入:nums = [1,2,3]
輸出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

輸入:nums = [0]
輸出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

解法1:遞迴

/**
 * 思路:
 * 獲取每個數,每次遞迴都是當前數+1,找到其所有的組合,每次都加入結果集
 * 遞迴結束後刪除這個數
 * []
 * 1的所有可能:1,12,123,12,13,1
 * 2的所有可能:2,23,2
 * 3的所有可能:3
 */
    public List<List<Integer>> subsets(int[] nums) {
        ArrayList<List<Integer>> result = new ArrayList<>();
        LinkedList<
Integer>
queue = new LinkedList<>(); result.add(new ArrayList<>()); recursive(result,queue,nums,0); return result; } private void recursive(ArrayList<List<Integer>> result, LinkedList<Integer> queue, int[] nums, int lattice) { for
(int i=lattice;i<nums.length;i++){ queue.offer(nums[i]); result.add(new ArrayList<>(queue)); recursive(result, queue, nums, i+1); queue.removeLast(); } }

時間複雜度:On

空間複雜度:On
在這裡插入圖片描述

解法2:遞迴(放格子)

    public List<List<Integer>> subsets(int[] nums) {
        ArrayList<List<Integer>> result = new ArrayList<>();
        LinkedList<Integer> queue = new LinkedList<>();
        recursive(result,queue,nums,0);
        return result;
    }

    private void recursive(ArrayList<List<Integer>> result, LinkedList<Integer> queue, int[] nums, int lattice) {
        if (lattice==nums.length){
            result.add(new ArrayList<>(queue));
            return;
        }
        recursive(result, queue, nums, lattice+1);
        queue.offer(nums[lattice]);
        recursive(result, queue, nums, lattice+1);
        queue.removeLast();
    }

時間複雜度:On

空間複雜度:On
在這裡插入圖片描述

解法3:迭代

/**
 * 思路:
 * 每增加一個元素讓之前所有的結果集中加入這個元素
 */
    public List<List<Integer>> subsets(int[] nums) {
        ArrayList<List<Integer>> result = new ArrayList<>();
        result.add(new ArrayList<>());
        for (int num:nums){
            int size = result.size();
            for (int i=0;i<size;i++){
                List<Integer> list = new ArrayList<>(result.get(i));
                list.add(num);
                result.add(list);
            }
        }
        return result;
    }

時間複雜度:On^2

空間複雜度:On
在這裡插入圖片描述

解法4:位運算

/**
 * 思路:
 * 每個數有兩個選擇,放入格子,或者不放入。
 * 因此結果集的長度是2^n
 * 比如陣列1,2,3
 * 有8種可能性,用0表示不放,1表示放。正好可以用1-8的二進位制數表示放或不放
 * (res_index >> index) & 1檢視當前位是否放元素
 *
 */
    public List<List<Integer>> subsets(int[] nums) {
        ArrayList<List<Integer>> result = new ArrayList<>();
        for (int result_index = 0; result_index < 1 << nums.length; result_index++) {
            ArrayList<Integer> list = new ArrayList<>();
            for (int index = 0; index < nums.length; index++) {
                if (((result_index >> index) & 1) == 1) list.add(nums[index]);
            }
            result.add(list);
        }
        return result;
    }

時間複雜度:On^2

空間複雜度:On
在這裡插入圖片描述