栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Leetcode-78】Subsets(子集)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Leetcode-78】Subsets(子集)

前言

Github:Leetcode-78. Subsets(代码实现)

题目

Leetcode-78. Subsets

Leetcode-78. 子集

题目含义

在不重复元素数组中,寻找所有可能的非重复子集。

算法思路

1、注意一个特殊的集合空集,空集是任何集合的子集;

2、回溯算法(试探法)

  • 在搜索尝试过程中寻找问题的解,在这个问题中就是尝试寻找合适的子集;
  • 如果不满足条件,此路不通,就回退一步重新选择,如果不满足非重复子集的条件,回退到上一步,走别的路径寻找;
算法代码
package com.jpeony.leetcode.n0078;

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


public class N78_Subsets {

    
    private static List> subsets(int[] nums) {
        List> ans = new ArrayList<>();
        backtrack(0, nums, ans, new ArrayList());
        return ans;
    }

    private static void backtrack(int i, int[] nums, List> ans, ArrayList temp) {
        // 每个子集放入返回结果
        ans.add(new ArrayList<>(temp));
        System.out.println("i = " + i + ", ans = " + ans + ", cur = " + temp);
        // 寻找符合条件的子集合
        for (int j = i; j < nums.length; j++) {
            temp.add(nums[j]);
            backtrack(j + 1, nums, ans, temp);
            System.out.println("backtrack-before = " + ans);
            temp.remove(temp.size() - 1);
        }
    }

    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        List> subsets = subsets(nums);
        System.out.println("subsets = " + subsets);
    }
}
复杂度分析

时间复杂度:O(n×2^n)。一共 2^n 个状态,每种状态需要 O(n) 的时间来构造子集。

空间复杂度:O(n)。渐进空间为存储子集的临时列表,n 为子集个数,所以空间复杂度为 O(n)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677377.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号