java子集(力扣Leetcode78)

子集

力扣原题链接

问题描述

给定一个整数数组 nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。可以按任意顺序返回解集。

示例

示例 1:

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

示例 2:

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

解题思路

这是一个典型的回溯算法问题,需要找出给定数组的所有可能子集。我们可以通过递归回溯的方法来解决。

  1. 初始化结果列表: 定义一个列表 res 用于存储所有可能的子集。
  2. 回溯搜索: 定义一个回溯函数 backtrack,其参数包括当前处理的索引 start、当前已形成的子集 path
  3. 将当前子集加入结果列表: 在每次递归调用回溯函数之前,将当前子集 path 加入结果列表 res
  4. 结束条件:start 等于数组长度时,表示已处理完所有元素,结束当前递归。
  5. 选择列表: 对于当前索引 start,我们有两种选择:选择当前元素加入子集,或者不选择当前元素。
  6. 递归进入下一层: 如果选择当前元素,则将当前元素加入子集 path,并递归调用回溯函数,传入更新后的索引 i + 1 和子集 path
  7. 撤销选择: 回溯到上一层时,需要撤销当前选择,即将当前元素从子集 path 中移除,然后尝试不选择当前元素的情况,递归调用回溯函数。

请添加图片描述

Java解题

写法一
class Solution {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {backtrack(nums, 0, new ArrayList<Integer>());return res;}public void backtrack(int[] nums, int start, List<Integer> path) {res.add(new ArrayList<>(path)); // 将当前子集加入结果列表if (start == nums.length) return; // 结束条件// 选择当前元素加入子集,并递归进入下一层for (int i = start; i < nums.length; i++) {path.add(nums[i]);backtrack(nums, i + 1, path);path.remove(path.size() - 1); // 撤销选择}}
}
写法二
class Solution {List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {List<Integer> subset = new ArrayList<>();backtrack(nums, 0, subset);return res;}public void backtrack(int[] nums, int index, List<Integer> subset) {// 结束条件:已处理完所有元素,将当前子集加入结果列表if (index == nums.length) {res.add(new ArrayList<>(subset));return;}// 选择当前元素加入子集,并递归进入下一层subset.add(nums[index]);backtrack(nums, index + 1, subset);// 撤销选择,不选择当前元素,并递归进入下一层subset.remove(subset.size() - 1);backtrack(nums, index + 1, subset);}
}

通过回溯算法,我们可以找出给定数组 nums 的所有可能子集。在回溯搜索的过程中,我们不断做出选择,尝试所有可能的情况,直到满足结束条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/577830.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KubeSphere 社区双周报|2024.03.15-03.29

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2024.03.15-03.29…

Java8之接口默认方法

Java8之接口默认方法 一、介绍二、代码1、接口2、实现类3、测试代码4、效果 一、介绍 在Java8中&#xff0c;允许为接口方法提供一个默认的实现。必须用default修饰符标记这样一个方法。默认方法也可以调用其他方法 二、代码 1、接口 public interface PersonService {void…

【CTFshow 电子取证】套的签到题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

GooleNet神经网络介绍

一、简介 GoogleNet&#xff0c;也称为GoogLeNet&#xff0c;是谷歌工程师设计的一种深度神经网络结构&#xff0c;它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上&#xff0c;通过引入名为Inception的核心子网络结构&#x…

Machine Learning机器学习之数据可视化

目录 前言 一、 数据预处理与清洗 二、常见可视化技术 三、可视化工具和平台 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神&#xff0c;答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者…

electron+VUE Browserwindow与webview通信

仅做记录 前言&#xff1a; electronVUEVITE框架&#xff0c;用的是VUE3.0 主进程定义&#xff1a;用于接收webview发送的消息 ipcMain.on(MyWebviewMessage, (event, message) > {logger.info(收到webmsg message)//转发给渲染进程}) porelaod/webPreload.js定义 cons…

深圳区块链交易所app系统开发,撮合交易系统开发

随着区块链技术的迅速发展和数字资产市场的蓬勃发展&#xff0c;区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中&#xff0c;区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…

【Spring源码】WebSocket做推送动作的底层实例

一、前瞻 Ok&#xff0c;开始我们今天的对Spring的【模块阅读】。 那就挑Web里的WebSocket模块&#xff0c;先思考下本次阅读的阅读线索&#xff1a; WebSocket在Spring里起到什么作用这个模块采用了什么设计模式我们都知道WebSocket可以主动推送消息给用户&#xff0c;那做推…

大家快来听,分享一个寄快递省钱赚钱的方法哦!

大家再寄快递的时候&#xff0c;会有很多种方法来供我们选择&#xff0c;可以直接去驿站寄快递&#xff0c;但是这样是不是想的略微麻烦了&#xff0c;可以在官网上下单&#xff0c;快递员上门取件&#xff0c;但是价格也是不便宜的吧&#xff0c;如果是公司一下子大批量的寄件…

Linux系统常用命令

Linux系统常用命令 文章目录 Linux系统常用命令一、系统管理类二、文件与目录管理类|三、文件与目录管理类||四、网络管理类五、磁盘管理类六、Oracle常用命令七、QData常用命令 一、系统管理类 二、文件与目录管理类| 三、文件与目录管理类|| 四、网络管理类 五、磁盘管理类 六…

量化交易入门(二十八)什么是布林带,量化中怎么使用

什么叫布林带 布林带&#xff08;Bollinger Bands&#xff09;是一种常用的技术分析指标&#xff0c;由约翰布林&#xff08;John Bollinger&#xff09;于20世纪80年代开发。它由三条线组成&#xff1a;中轨&#xff08;通常为20日移动平均线&#xff09;、上轨&#xff08;中…

类的成员之三:构造器(Constructor)

类的成员之一&#xff1a;成员变量 (field) 类的成员之二&#xff1a;方法 (method) 我们 new 完对象时&#xff0c;所有成员变量都是默认值&#xff0c;如果我们需要赋别的值&#xff0c;需要挨个为它们再赋值&#xff0c;太麻 烦了。我们能不能在new 对象时&#xff0c;直接…