力扣题/回溯/子集

2024-08-28 11:44
文章标签 力扣题 回溯 子集

本文主要是介绍力扣题/回溯/子集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

子集

力扣原题

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

示例 1:

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

示例 2:

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

/*** @param {number[]} nums* @return {number[][]}*/
var subsets = function(nums) {const res = []function dfs(idx = -1, arr = []) {if(idx > -1) {arr.push(nums[idx])}res.push(arr)for(let i = idx + 1; i < nums.length; i++) {dfs(i, [...arr])}}dfs()return res
};

解题思路

使用深度遍历,因为需要返回所有子集,则不能重复,所以在深度遍历中,每一层 的for循环,都不循环前面已经遍历过的数即可,即for循环中的let i = idx + 1;
nums = [1,2,3]举例:

  1. 开始dfs(),第0层, 结果为 []
  2. 第0层for循环 i = 0,dfs(0, []),进入第1层, 结果为[1]
  3. 第1层for循环 i = 1,dfs(1, [1]),进入第2层, 结果为[1, 2]
  4. 第2层for循环 i = 2,dfs(2, [1, 2]), 进入第3层,结果为[1, 2, 3]
  5. 第3层for循环 i = 3循环结束,退回第2层for循环 i = 3循环结束,退回第1层
  6. 第1层 for循环 i = 2,dfs(2, [1]),进入第2层,结果为[1, 3]
  7. 第2层for循环 i = 3循环结束,退回第1层for循环 i = 3循环结束,退回第0层
  8. 第0层for循环 i = 1,dfs(1, []),进入第1层, 结果为[2]
  9. 第1层for循环 i = 2,dfs(2, [2]), 进入第2层,结果为[2, 3]
  10. 第2层for循环 i = 3结束循环,退回第1层for循环 i = 3循环结束,退回第0层
  11. 第0层for循环 i = 2,dfs(2, []),进入第1层, 结果为[3]
  12. 第1层for循环 i = 3循环结束
  • 最终输出结果为:[[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]

这篇关于力扣题/回溯/子集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114666

相关文章

回溯——9.全排列

力扣题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解题思路 问题建模:题目要求给出一个数组的所有排列组合,属于典型的全排列问题,这可以用回溯法来解决。回溯法通过递归的方式,依次将数组中的每个元素放入排列中,直到生成

风控系统之指标回溯,历史数据重跑

个人博客:无奈何杨(wnhyang) 个人语雀:wnhyang 共享语雀:在线知识共享 Github:wnhyang - Overview 回顾 默认你已经看过之前那篇风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法。 其中已经介绍了如何利用redis的zset结构完成指标计算,为了方便这篇文章的介绍,还是在正式开始本篇之前回顾一下。 时间窗口 zset

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

165-Stamps【回溯】

回溯 给h和k的意思是在k种邮票中选h个邮票 基本的连续邮资问题 15226160 165 Stamps Accepted C++ 0.062 2015-03-27 07:21:37 #include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 2

回溯——8.递增子序列

力扣题目链接 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。 示例: 输入: [4, 6, 7, 7]输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]] 说明: 给定数组的长度不会超过15。数组中的整数范围是 [-100,100]。给定数组中

【代码随想录|回溯part04】

代码随想录|回溯part04 1、46.全排列2、47.全排列 II3.问题 总结 python 1、46.全排列 46.全排列 class Solution:def permute(self, nums):result = []self.backtracking

代码随想录算法训练营第十九天| 回溯理论、77. 组合、216. 组合总和Ⅲ、17. 电话号码的字母组合

今日内容 回溯的理论基础leetcode. 77 组合leetcode. 216 组合总和Ⅲleetcode. 17 电话号码的字母组合 回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索的方式,而且只要有递归就会有回溯,回溯就是递归的副产品。 回溯说到底并不是什么非常高深的搜索方式,本质上仍然是穷举,穷举所有可能然后选择出我们要的答案。剪枝会使回溯法更加高效一点,但改变不了回溯本质就是穷举

力扣416-分割等和子集(Java详细题解)

题目链接:416. 分割等和子集 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完01背包,所以现在的题解都是以01背包问题为基础再来写的。 如果大家不懂01背包的话,建议可以去学一学,01背包问题可以说是背包问题的基础。 如果大家感兴趣,我后期可以出一篇专门讲解01背包问题。 dp五部曲。 1.确定dp数组和i

代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集

目录 0、背包问题基础01背包 46. 携带研究材料(01背包)1、题目描述2、思路3、code(二维解法)3-1、code(一维解法)4、复杂度分析 416. 分割等和子集1、题目描述2、思路3、code4、复杂度分析 0、背包问题基础 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能

代码随想录算法训练营第三十五天| 416. 分割等和子集

416. 分割等和子集 题目: 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2: 输入:nums = [1,2,3,5]输出:false解释:数组不能分割成两个元素和相等