力扣递归,回溯类型题目合集

  • 题目
  • 思路与算法
  • 代码实现
  • 写在最后

题目

  1. 子集


2. 90. 子集 II

3. 40. 组合总和 II

4. 22. 括号生成

思路与算法

    1. 子集:注释的很详细,递归生成子集。还有一种位运算的方法更加简洁,但是如果不熟练的话会比较吃力。
    1. 子集 II: 其余思路同上题,总体不同在于通过排序去除乱序相同的子集,再通过set去重即可。
    1. 组合总和 II:还是在上一题的基础上,继续增加条件,在递归获取所有子集的同时,利用题目要求的target进行剪枝。
    1. 括号生成:也是此类递归代码的同类思路,重在理解这个过程。发现很久之前提交的Java版本注释的比较详细,cpp的也附上

代码实现

  1. 子集
class Solution {public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> result;vector<int> item;// 一开始需要加入一个空集先result.push_back(item);generate(0,nums,item,result);return result;}public:// 从nums[n]开始,一个一个选择放入item或者不放入item的加入result来获得所有子集void generate(int n,vector<int> &nums,vector<int> &item,vector<vector<int>> &result){if (n >= nums.size()) {return;}// 将nums[0]加入item,再放入resultitem.push_back(nums[n]);result.push_back(item);generate(n + 1,nums,item,result);// 或者不加入item,直接放入resultitem.pop_back();generate(n + 1,nums,item,result); }
};
  1. 子集 II
class Solution {public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<vector<int>> result;vector<int> item;set<vector<int>> res_set;// 排序就可以去除顺序不同的相同子集,方便后续使用set进行去重sort(nums.begin(),nums.end());result.push_back(item);generate(0,nums,result,item,res_set);return result;}private:void generate (int i,vector<int> & nums,vector<vector<int>> &result,vector<int> &item,set<vector<int>> &res_set) {if (i >= nums.size()) {return;}item.push_back(nums[i]);if (res_set.find(item) == res_set.end()) {result.push_back(item);res_set.insert(item);}generate(i + 1,nums,result,item,res_set);item.pop_back();generate(i + 1,nums,result,item,res_set);}
};
  1. 组合总和 II
class Solution {public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {vector<vector<int>> result;vector<int> item;set<vector<int>> res_set;sort(candidates.begin(),candidates.end());generate(0,candidates,result,item,res_set,0,target);return result;}private:void generate(int i,vector<int> &nums,vector<vector<int>> &result,vector<int> &item,set<vector<int>> &res_set,int sum,int target){if (i >= nums.size() || sum > target) {return;}sum += nums[i];item.push_back(nums[i]);if (  (target == sum) && res_set.find(item) == res_set.end()) {result.push_back(item);res_set.insert(item);}generate(i+1,nums,result,item,res_set,sum,target);sum -= nums[i];item.pop_back();generate(i+1,nums,result,item,res_set,sum,target);}
};
  1. 括号生成

Java详细注释版本:

class Solution {private void generate(String item,int left,int right,List res) {//左括号和右括号满足上述条件的前提下都为n个,添加这个答案if(left == 0 && right == 0) {res.add(item);return;}//左括号的个数小于n 才能继续放左括号if(left > 0) {generate(item+"(",left-1,right,res);}//左括号个数必须大于右括号的放置个数 才能继续放右括号if(left < right) {generate(item+")",left,right-1,res);}}public List<String> generateParenthesis(int n) {/***左括号个数必须大于右括号的放置个数 才能继续放右括号*左括号的个数小于n 才能继续放左括号*左括号和右括号满足上述条件的前提下都为n个,添加这个答案*/List<String> res = new ArrayList<>();generate("",n,n,res);return res;}
}

cpp实现:

class Solution {public:vector<string> generateParenthesis(int n) {vector<string> result;generate("",n,n,result);return result;}private:void generate (string item, int left,int right,vector<string> &result) {if (left == 0 && right == 0) {result.push_back(item);return;}if (left > 0) {generate(item+'(',left - 1,right,result);}if (left < right) {generate(item + ')',left,right - 1,result);}}
};

写在最后

  1. 递归的思路若能理解即为手中很好的工具和武器,对付各类类暴力的枚举类题目有奇效。
  2. 重在理解递归本意,而不是单纯的做一道是一道。

20210325:力扣递归,回溯类型题目合集相关推荐

  1. 20210322 :贪心思想力扣典型题目合集

    贪心思想力扣典型题目合集 写在前面 题目列表 思路分析 代码实现 写在前面 贪心的思想很多时候在于想到那个贪心的点上,而对徒手书写某些代码结构的能力并不做要求,个人认为需要的是你敏锐的意识到这个贪心的 ...

  2. 珍宝鸭的力扣练习(7):分治法题目合集

    动态规划和分治法的区别 动态规划也是一种分治思想(比如其状态转移方程就是一种分治),但与分治算法不同的是,分治算法是把原问题分解为若干个子问题,自顶向下求解子问题,合并子问题的解,从而得到原问题的解. ...

  3. 牛客网-精华专题-前端校招面试题目合集

    前端校招面试题目合集 501 HTML CSS 前端基础 HTML 浏览器页面有哪三层构成,分别是什么,作用是什么? 构成:结构层(structural layer).表示层(presentation ...

  4. 20210310 20210311 :栈、队列、堆类题目合集

    栈.队列.堆类题目合集 写在前面 题目列表 思路分析 代码实现 写在前面 栈.队列.堆基本的题目就是这些,需要特殊技巧的另算,重写一遍保证熟练掌握这些题目并且达到熟练使用的程度.记录以便后续再次学习. ...

  5. 高难度c语言编程题,高难度脑筋急转弯题目合集带答案

    脑筋急转弯,是指一些不能用惯性思维来回答的问题.经常玩这类游戏,可以锻炼人的发散思维以及应变能力,提高反应速度.今天给大家带来一些脑筋急转弯干货,希望可以帮助到有需要的同学! 高难度脑筋急转弯题目合集 ...

  6. 中高级面试题题目合集

    题目合集持续更新ing- 前端基础github地址.README.md可以下载到typora中打开,会有整个大纲目录显示(github中markdown目录快捷生成方式不现实,之后可能会想办法生成贴过 ...

  7. 20210308 20210309 :链表类题目合集

    链表类题目回顾 写在前面 题目 思路与算法 代码实现 写在前面 这一类的题目上一次编写是在刚好6个月之前,也就是我20200908和20200909的两篇博客涉及了今天这一篇的所有题目,均为链表相关. ...

  8. 力扣算法题-19.秋叶收藏集 C语言实现

    题目 小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片 ...

  9. 面试妥了!2020 爬虫面试题目合集

    作者 | 不愿透露姓名の网友 出品 | CSDN博客 介绍爬虫 1.爬虫:自动的抓取互联网上信息的脚本文件. 2.爬虫可以解决的问题: (1)解决冷启动问题 (2)搜索引擎的根基:做搜索引擎少不了爬虫 ...

最新文章

  1. List泛型集合总结(一)
  2. 嵌入式Linux学习问题解决记录
  3. 资料收集新一代 Linux 文件系统 btrfs 简介
  4. 字符串匹配rk算法c语言,字符串匹配问题(BFRK算法)
  5. 一个有用的区别IE不同浏览器CSS的标签
  6. java 对象回收_如何处理JAVA大量对象回收问题?
  7. 工业控制系统发展历程
  8. android抢qq红包源码,QQ抢红包插件实现
  9. c语言链表小甲鱼,有大佬做过小甲鱼双向链表实践吗小甲鱼
  10. 学习 canvas (二) 绘制图表
  11. 微信小程序商城项目实战(第八篇:我的界面)
  12. 注册gitLab时报错There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.
  13. 视频采集站-免费视频资源采集工具-免费视频资源网采集
  14. 加油中国,雄起汶川-快乐工作,快乐生活(多图)
  15. AutoCAD2019开发配置
  16. 微信扫码支付dome php,帝国cms 微信扫码支付 模式二 扫码付款demo
  17. 配置聚合连接 和 配置firewalld防火墙
  18. OpenCV中视频操作及人脸识别案例
  19. 筑基_C_5_对数组的二分查找
  20. 长城汽车使用ENOVIA物料合规管理模块(MCC)

热门文章

  1. 电信、联通合建 5G,将会碰出怎样的火花?
  2. 为何 5G、物联网和区块链,可以成为科技铁三角?
  3. 漫画面向对象编程,用漫画给你讲技术!
  4. “偷师腾讯”,苹果要分游戏这杯羹!| 畅言
  5. 马云:遇见好老板很重要;锤子上海法人变更;摩拜更名美团单车 | 极客头条...
  6. 微信“欲封”百度;AI 主播入职新华社;今日头条遭狠罚 | 极客头条
  7. 阿里游戏之心不死?| 畅言
  8. 阿里云的工程师要被祭天了?
  9. 阿里布局无人驾驶;滴滴成立汽车服务;“京东 AI 天团”首亮相| CSDN极客头条...
  10. 在程序员眼里,马云 1000 亿的大业败给了王者荣耀 100 个月工资的奖金