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)

猜你喜欢

转载自blog.csdn.net/zy345293721/article/details/84874770