Day15-递归&回溯-无重复数组的子集
时间:2022-06-25
本文章向大家介绍Day15-递归&回溯-无重复数组的子集,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一 唠嗑
我又拖更了,我出来挨打了
本来昨天题的代码都写完了,但pm姐姐说,这个需求明天必须上,没办法,昨天就没时间写文章了
然后就是,从今天开始,开始递归+回溯的算法题
然后这周保证天天更!
二 上题吧!
Q:已知一个数组,无重复元素,求能组成的所有子集。
举例:对于nums = 【1,2,3】
那么就要返回[ [], [1], [1,2], [1,2,3], [1,3], [2,3], [2], [3]]
三 冷静分析
此时你脱口而出,遍历一遍不就行了,这题也拿来面我,渣渣
那你一定没动手码,因为这样很困难
我们一趟遍历完,只能得到[[1], [1,2], [1,2,3]]这样的子集,和单个数字的子集,因为我们没办法遍历到某个位置,往回遍历来取其他子集。
那怎么做啊
不卖关子,也节省一下时间,引入递归的概念:
一句话概括就是,函数自己调用自己,也叫递归调用
再引入个概念,回溯:
当遍历/前进到某个位置,无法满足要求,就回退一步重新选择。这种走不通就回退的方法,叫回溯。
好,回到题目。我们可以这样处理逻辑:
利用回溯算法,生成子集。即对于每个元素,都有试探放入或不放入。
先选择放入该元素,递归地进行后续元素的选择,完成放入该元素后续所有元素的试探;
然后将该元素拿出,进行一次,不放入该元素时,递归地进行后续元素的选择。
四 完整代码及注释
//
// 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的变化,截图给大家
- 架构高性能网站秘笈(三)——浏览器缓存
- 剑指 offer代码解析——面试题39判断平衡二叉树(高效方法)
- 跟着柴毛毛学Spring(4)——面向切面编程![这里写图片描述](http://img.blog.csdn.net/20171031111402095)
- MYSQL数据闪回方式
- 剑指 offer代码解析——面试题39判断平衡二叉树
- 跟着柴毛毛学Spring(3)——简化Bean的配置
- 剑指 offer代码解析——面试题39二叉树的深度
- 跟着柴毛毛学Spring(2)——Bean的配置
- C++ 使用STL string 实现的split,trim,replace-修订
- 跟着柴毛毛学Spring(1)——纵观Spring
- MYSQL常用SQL汇总
- Linux 下设置SVN DIFF
- 剑指 offer代码解析——面试题38数字在排序数组中出现的次数
- 剑指 offer代码解析——面试题37两个链表的第一个公共结点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 2020最新Android面筋:太难了!历经一周对接6个面试官后,我的头条Offer终于来了!
- 第三章--第五节:集合
- Python 爬虫超详细讲解(零基础入门,老年人都看的懂)
- JavaWeb - Linux Operating System
- 第三章--第六节:元祖
- JavaWeb - 开发环境搭建和 Shell 编程
- 第四章--第一节:函数
- 教育平台项目后台管理系统:接口文档
- 第四章--第二节:类
- 教育平台项目后台管理系统:介绍与搭建
- Python办公自动化之Excel做表自动化:全网最全,看这一篇就够了!
- Java学习笔记-spring-Bean实例化
- Java学习笔记-spring-Bean作用于
- 教育平台项目后台管理系统:课程信息模块
- 教育平台项目后台管理系统:课程内容模块