前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Day15-递归&回溯-无重复数组的子集

Day15-递归&回溯-无重复数组的子集

作者头像
BUPTrenyi
发布于 2019-07-15 08:58:23
发布于 2019-07-15 08:58:23
44200
代码可运行
举报
运行总次数:0
代码可运行

一 唠嗑

我又拖更了,我出来挨打了

本来昨天题的代码都写完了,但pm姐姐说,这个需求明天必须上,没办法,昨天就没时间写文章了

然后就是,从今天开始,开始递归+回溯的算法题

然后这周保证天天更!

二 上题吧!

Q:已知一个数组,无重复元素,求能组成的所有子集。

举例:对于nums = 【1,2,3】

那么就要返回[ [], [1], [1,2], [1,2,3], [1,3], [2,3], [2], [3]]

三 冷静分析

此时你脱口而出,遍历一遍不就行了,这题也拿来面我,渣渣

那你一定没动手码,因为这样很困难

我们一趟遍历完,只能得到[[1], [1,2], [1,2,3]]这样的子集,和单个数字的子集,因为我们没办法遍历到某个位置,往回遍历来取其他子集。

那怎么做啊

不卖关子,也节省一下时间,引入递归的概念:

一句话概括就是,函数自己调用自己,也叫递归调用

再引入个概念,回溯:

当遍历/前进到某个位置,无法满足要求,就回退一步重新选择。这种走不通就回退的方法,叫回溯。

好,回到题目。我们可以这样处理逻辑:

利用回溯算法,生成子集。即对于每个元素,都有试探放入或不放入。

先选择放入该元素,递归地进行后续元素的选择,完成放入该元素后续所有元素的试探;

然后将该元素拿出,进行一次,不放入该元素时,递归地进行后续元素的选择。

四 完整代码及注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
// Created by renyi on 2019/6/24.
//
#include <iostream>
#include <vector>
using namespace std;

void findSubsets(int i, vector<int> &nums, vector<int> &item, vector<vector<int>> &result){
    if (i >= nums.size()){
        return;
    }
    item.push_back(nums[i]);//将nums的每个元素放入数组item
    result.push_back(item);//将item数组,放入最后的二维数组result
    findSubsets(i + 1, nums, item, result);//放入一个元素后,递归进行后续元素的选择
    item.pop_back();//将该元素拿出来
    findSubsets(i + 1, nums, item, result);//再递归跑一次,不放入该元素的情况下,对于后续元素的处理
}

vector<vector<int>> subsets(vector<int> &nums){
    vector<vector<int>> result;//最终结果,二维数组
    vector<int> item;//一维数组item
    result.push_back(item);
    findSubsets(0, nums, item, result);
    return result;
}

int main(){
    vector<int> nums;
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);
    vector<vector<int>> result;
    result = subsets(nums);
    for (int i = 0; i < result.size(); i++) {
        if (result[i].size() == 0){
            printf("[]");
        }
        for (int j = 0; j < result[i].size(); j++) {
            printf("[%d]", result[i][j]);
        }
        printf("\n");
    }
    return 0;
}

运行结果

为了便于理解,我在16行处打断点后单步,查看result的变化,截图给大家

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法其实很好玩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Day16-递归&回溯-有重复数组的子集
其实今天这道题本应该在昨天的,第二篇文章中的,奈何需求多而紧,着实没时间写第二篇文章了,你们可不要以为我是划水啊
BUPTrenyi
2019/07/15
4840
Day16-递归&回溯-有重复数组的子集
递归函数基础
函数代码中调用自己时称为递归,该函数被称为递归函数。递归函数是一个很高效的 开发技巧,可以极大的简化代码提高开发效率。递归函数与循环类似,循环可以完成的 事情,递归函数都可以完成,并且对于一些复杂的问题,递归函数的实现代码更简单
小飞侠xp
2018/08/29
5700
递归&回溯-子集之和
Q:已知一个数组,可能有重复元素,给定值target,求出所有子集中,和为target的,不重复的子集。
BUPTrenyi
2019/07/15
5160
递归&回溯-子集之和
回溯算法:求子集问题!
题目地址:https://leetcode-cn.com/problems/subsets/
代码随想录
2020/11/10
1.7K0
回溯算法:求子集问题!
回溯算法团灭排列/组合/子集问题
今天就来聊三道考察频率高,而且容易让人搞混的算法问题,分别是求子集(subset),求排列(permutation),求组合(combination)。这几个问题都可以用回溯算法解决。
lucifer210
2020/02/26
1.6K0
【回溯】学会全排列了吗?来看看子集问题!
​ 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
利刃大大
2025/02/02
730
【回溯】学会全排列了吗?来看看子集问题!
刷题打卡-子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
早起的鸟儿有虫吃
2023/03/21
2060
刷题打卡-子集
回溯算法:求子集问题(二)
题目链接:https://leetcode-cn.com/problems/subsets-ii/
代码随想录
2020/11/10
5290
回溯算法:求子集问题(二)
力扣78题-子集
力扣78. 子集 题目描述: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums = [1,2,3] 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] 示例 2: 输入:nums = [0] 输出:[[],[0]] 提示: 1 <= nums.length <= 10 -10 <= nums[i] <= 10 nums 中的
ccf19881030
2023/02/26
2020
力扣78题-子集
【C++】算法集锦(3):回溯,从入门到入土,七道试题精选、精讲、精练
回溯算法,之前也是写过的,感觉还不错。但是之前分成两篇写了,现在重新整理一下,顺便我自己也回顾一下。
看、未来
2021/09/18
3830
【一天一大 lee】子集 (难度:中等)-Day20200920
在选择多个原数组的元素组成新成组合时,对于任何一个原数组的元素在新的组合中都可以对其有两种选择形式:当前位置选择或者不选择。
前端小书童
2020/09/24
2750
【一天一大 lee】子集 (难度:中等)-Day20200920
Day23-排序-快排&堆排&归并排序
右指针--,直到找到比基准值小的元素,将左右指针指向的元素进行交换;
BUPTrenyi
2019/07/30
4150
Day23-排序-快排&堆排&归并排序
子集问题也要去重了!
力扣题目链接:https://leetcode-cn.com/problems/subsets-ii/
代码随想录
2021/10/19
3830
【代码随想录】二刷-回溯算法
回溯算法 ---- 什么是回溯算法? 回溯算法也可以叫做回溯搜索法,它是一种搜索方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率: 回溯法的本质是穷举,穷举所有可能,然后选出我们想要的答案。(n层for循环嵌套) 如果想让回溯法更高效一些,可以加一些剪枝操作,但也无法改变回溯法就是穷举的本质。 回溯法一般可以解决如下几种问题: 组合问题: N个数里面按一定规则找出K个数的集合 切割问题: 一个字符串按一定规则由于几种切割方式 子集问题: 一个N个数的集合里有
半生瓜的blog
2023/05/13
9490
【代码随想录】二刷-回溯算法
【回溯算法】回溯,从入门到入土,七道试题精选、精讲、精练
前期准备,要玩得转回溯,递归的基础还是要有的,所以前些日子我就先把递归部分给办了。 【LeetCode】递归 原理入门+复杂度计算+练手试题
看、未来
2020/08/25
4570
【回溯算法】回溯,从入门到入土,七道试题精选、精讲、精练
LeetCode 78. 子集(回溯)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/subsets 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2021/02/20
1840
LeetCode 78. 子集(回溯)
子集和全排列(深度优先遍历)问题
本篇采用两道例题来讲解利用枚举元素的方法使用决策树通过递归以及穿插回溯来解答类似此类问题的系列模版操作(涉及全局变量以及引用传参使用需要回溯问题与具体什么时候使用等)。
用户11458826
2025/01/23
890
子集和全排列(深度优先遍历)问题
回溯算法:递增子序列
题目链接:https://leetcode-cn.com/problems/increasing-subsequences/
代码随想录
2020/11/11
1.2K0
回溯算法:递增子序列
子集问题-LeetCode 78、52(无重复子集,N皇后II)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例:
算法工程师之路
2019/10/14
6920
子集问题-LeetCode 78、52(无重复子集,N皇后II)
Leetcode 78 Subsets
Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example, If nums = [1,2,3], a solution is: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 求出给定集合的所
triplebee
2018/01/12
4510
相关推荐
Day16-递归&回溯-有重复数组的子集
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文