当前位置: 首页 > news >正文

leetcode hot100【LeetCode 78. 子集】java实现

LeetCode 78. 子集

题目描述

给定一个不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明: 解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]
]
Java 实现解法
import java.util.ArrayList;
import java.util.List;public class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<>();backtrack(result, new ArrayList<>(), nums, 0);return result;}private void backtrack(List<List<Integer>> result, List<Integer> current, int[] nums, int index) {// 将当前子集加入结果result.add(new ArrayList<>(current));// 尝试从当前 index 开始构建子集for (int i = index; i < nums.length; i++) {current.add(nums[i]);  // 添加元素到当前子集backtrack(result, current, nums, i + 1);  // 递归处理下一个元素current.remove(current.size() - 1);  // 回溯}}
}
解题思路
  1. 回溯法

    • 问题的本质是生成一个数组的所有子集,可以看作是枚举所有可能的子集。
    • 从数组 nums 中选取元素时,对于每个元素,有两种选择:要么包含它,要么不包含它。
    • 可以通过回溯来实现:在递归过程中,不断地选择包含或者不包含当前元素,并将每个生成的子集加入到结果列表中。
    • 每当递归到一个位置时,就将当前路径(子集)加入结果列表,并继续尝试将剩余的元素加入子集。
  2. 递归+回溯

    • 每一步递归选择当前元素加入子集或者不加入。
    • 使用回溯来删除当前选择的元素并继续探索其他可能性。
复杂度分析
  • 时间复杂度O(n*2^n),其中n是数组的长度。这是因为对于每个子集,算法都需要遍历数组一次来决定是否包含当前元素。
  • 空间复杂度O(n),递归的最大深度为 n,即当前子集的大小最多为 n。因此,递归栈的空间复杂度为 O(n)

http://www.mrgr.cn/news/68155.html

相关文章:

  • 二分查找习题篇(上)
  • Nextjs14记录
  • 认识软件测试
  • ◇【论文_20160610】Generative Adversarial Imitation Learning 【附录 A】
  • 大模型学习笔记------CLIP模型解读与思考
  • NAT网络工作原理和NAT类型
  • Docker启动gitlab后22端口被占用如何解决
  • Swift 开发教程系列 - 第9章:错误处理
  • 秒懂Linux之序列化及反序列化
  • 【VR】PICO 手部追踪 steamvr内无法识别,依旧识别手柄的解决方案
  • 羽星股份引领连锁业数智化转型,厦门羽星科技公司逆势增长剑指纳斯达克
  • 【Apache ECharts】<农作物病害发生防治面积>
  • win 查看显卡支持 CUDA版本
  • 如何找到捏蛋糕和修牛蹄类型的解压视频素材?
  • 什么是WebAssembly,有什么特点
  • FreeRTOS 13:FreeRTOS队列的读原理
  • Qt第三课 ----------容器类控件
  • 11.07学习
  • 泷羽sec学习打卡-shodan扫描7
  • 初识Java EE和Spring Boot