回溯的本质是穷举,穷举所有可能,然后选出我们想要的答案,如果想让回溯法高效一些,可以加一些剪枝的操作,但也改不了回溯法就是穷举的本质。

那么既然回溯法并不高效为什么还要用它呢?

因为没得选,一些问题能暴力搜出来就不错了,撑死了再剪枝一下,还没有更高效的解法。

回溯法解决的问题都可以抽象为树形结构,是的,我指的是所有回溯法的问题都可以抽象为树形结构!

因为回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度递归的深度构成的树的深度

递归就要有终止条件,所以必然是一棵高度有限的树(N叉树)。

回溯模板:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

77. 组合

题目链接

题目描述:
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

难点:
剪枝

思路:

时间复杂度:O()
空间复杂度:O()

class Solution {List<List<Integer>> result = new ArrayList<>();List<Integer> path = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backtracking(n, k, 1);return result;}public void backtracking(int n, int k, int startIdx) {if (n < 1 || n < k) return;if (path.size() == k) {result.add(new ArrayList<>(path));// result.add(path); 这是错误的!return;}for (int i = startIdx; i <= n; i++) {path.add(i);backtracking(n, k, i+1);path.remove(path.size()-1);}}
}

剪枝:

for (int i = startIdx; i <= n-(k-path.size())+1; i++) {path.add(i);backtracking(n, k, i+1);path.remove(path.size()-1);
}

时长:
15min

收获:
注意了!向列表中添加对象元素时,要考虑这个对象被添加后是否不能改变了。如果不能改变,必须要重新new一个对象,而不是指向原来的对象,否则结果集中的结果会产生改变。

代码随想录【Day24】| 开始回溯!77. 组合相关推荐

  1. 代码随想录第25天|216.组合总和III ● 17.电话号码的字母组合

    216.组合总和Ⅲ 回溯三部曲 确定递归函数参数 需要一维数组path来存放符合条件的结果,二维数组result来存放结果集. 接下来还需要如下参数: targetSum(int)目标和,也就是题目中 ...

  2. 代码随想录第二十五天|组合、电话号码的字母组合

    代码随想录第二十五天|216.17不熟 Leetcode 216. 组合总和 III Leetcode 17. 电话号码的字母组合 Leetcode 216. 组合总和 III 题目链接: 组合总和 ...

  3. 代码随想录第25天 | 216. 组合总和III、17. 电话号码的字母组合

    216. 组合总和III 回溯三部曲: 和77.组合一题一样,依然需要一维数组path来存放符合条件的结果,二维数组result来存放结果集.sum用来保存当前路径上的数字总和,方便和n进行对比是否等 ...

  4. 代码随想录算法训练营day25| 216.组合总和III、17.电话号码的字母组合

    Leetcode 216.组合总和III 题目链接 思路:回溯算法 代码: class Solution {List<Integer> path = new ArrayList<&g ...

  5. 代码随想录第25天|216.组合总和III,17.电话号码的字母组合

    LeetCode216.组合总和||| 题目链接:216. 组合总和 III - 力扣(LeetCode) 思路: class Solution { public:int sum = 0,start ...

  6. 代码随想录第22天 | ● 216.组合总和III ● 17.电话号码的字母组合

    216.组合总和III /*** @param {number} k* @param {number} n* @return {number[][]}*/ let path = []; let roa ...

  7. 代码随想录训练营day44

    题目一:零钱兑换II 力扣题目链接 题目描述: 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额. 请你计算并返回可以凑成总金额的硬币组合数.如果任何硬币组合都 ...

  8. 代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合

    77组合 看完题后的思路 void f(数组,startIndex) 递归终止 if(startIndex数组长度||path.sizek){ if(path.size==k){ 加入} } 递归 f ...

  9. Suzy找到实习了吗 Day24 | 回溯算法开始啦:回溯的理论知识,77组合(有一个问题没有解决)

    回溯算法理论 回溯算法解决的问题 组合问题 切割问题 子集问题 排列问题 棋盘问题 算法模板 函数没有返回值 业界给回溯算法命名:backtracking 算法伪代码模板 def backtracki ...

最新文章

  1. Web的桌面提醒(Popup)
  2. struts配置文件没有标签提示
  3. 每次digital painting 之后,都可以把作品放到这里,比较好看,也和nft相关度比较大
  4. 网络排错模型之我见----模型,基线,协议,数据包
  5. java double溢出_java – 可以加倍或BigDecimal溢出?
  6. 【另类见解】一致性哈希就能解决分库分表问题了?
  7. 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
  8. python中表示空类型的是_python中怎么表示空值
  9. Spring Framework 官方文档学习(三)之Resource
  10. 【微机实验系列】标准输入输出系统
  11. 2018大学计算机选择题题库,2018年9月计算机二级选择题题库(31-40)
  12. Charles安装破解和基础配置
  13. python linux 上 RS485通信 Modbus协议
  14. 从高德地图获取城市地铁线路+站点
  15. R语言中,如何设置当前工作文件路径?
  16. [Poi 2012] bzoj2794 Cloakroom [dp]
  17. CleanMyMac X 4.8版本更新!
  18. 如何使用AndriodStudio制作音乐播放器音乐列表界面和导入手机音乐资源
  19. Unity学习笔记 - API
  20. alice 和 bob 一起 van♂卡牌游戏

热门文章

  1. ​经典算法09 堆排序
  2. Linux磁盘维护命令大全
  3. 跟着iMeta学作图 | 山峦图展示微生物丰度随盐度增加的动态变化
  4. 调去系统照相机或者从本地相册获取图片.
  5. 网页设计作业花甲美食网站设计——精美花甲美食网页(8页) 海鲜网页制作作业 生鲜水果蔬菜网页设计模板 简单学生网页设计代做 静态HTML CSS网站制作成品
  6. 视觉SLAM十四讲 读书编程笔记 Chapter5 相机与图像
  7. C++之坦白说:我与C语言不得不说的那些事
  8. 论文解读:On The Alignment Problem In Multi-Head Attention-Based Neural Machine Translation
  9. 问卷调查是干什么呢?是通过什么赚钱?我相信大家都很好奇吧
  10. 计算机网络--应用层-应用层协议原理