1. 程式人生 > >LeetCode:78. Subsets(找出一個數組中所有的子集)

LeetCode:78. Subsets(找出一個數組中所有的子集)

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

方法1:遞迴的方式

package leetcode;

import org.junit.Test;
import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangyu
 * @version V1.0
 * @ClassName: Subsets
 * @Description: TOTO
 * @date 2018/12/7 10:32
 **/

// 這種利用遞迴的方式
public class Subsets2 {
    @Test
    public void fun() {
        int[] nums = {1, 2, 3};
        List<List<Integer>> list = subsets(nums);
        System.out.println(list);
    }

    private List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> subList = new ArrayList<>();
        subsets(nums, 0, subList, list);
        return  list;
    }

    private void subsets(int[] nums, int i, List<Integer> subList, List<List<Integer>> list){
        if (i == nums.length) {
            list.add(subList);
            return;
        }
        int num = nums[i];
        List<Integer> temp = new ArrayList<>(subList);
        temp.add(num);
        subsets(nums, i+1, temp, list);
        subsets(nums, i+1, subList, list);
        return;
    }
}

時間複雜度:O(n^2)

空間複雜度:O(n)


方法2:(利用非遞迴的方式,這種方法比較難以理解)

package leetcode;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhangyu
 * @version V1.0
 * @ClassName: Subsets
 * @Description: TOTO
 * @date 2018/12/7 11:36
 **/

// 找出一個數組中所有的子串
public class Subsets3 {
    @Test
    public void fun() {
        int[] nums = {1, 2};
        List<List<Integer>> list = subsets(nums);
        System.out.println(list);
    }

    private List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        // 陣列長度為0就直接返回
        if (nums == null || nums.length == 0) {
            return ret;
        }
        // 定義另外一個輔助陣列
        int[] pos = new int[nums.length];
        int index = 0; //標誌位index
        pos[0] = -1; //第一個位置為-1
        // 控制進行回溯
        while (index >= 0) {
            pos[index]++;
            if (pos[index] < nums.length) {
                List<Integer> s = new ArrayList<Integer>();
                for (int ii = 0; ii <= index; ii++) {
                    s.add(nums[pos[ii]]);
                }
                ret.add(s);
                if (index < nums.length - 1) {
                    index++;
                    pos[index] = pos[index - 1];
                }
                continue;
            }
            index--;
        }
        ret.add(new ArrayList<Integer>());
        return ret;
    }
}

時間複雜度:O(n^2)

空間複雜度:O(n)