学习目标

  • 学习回溯算法理论基础, 并进行练习

学习内容

回溯算法理论基础

文章链接:回溯算法理论基础

小结:回溯算法模板:

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

77. 组合(Middle)

题目链接:77. 组合

题目:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。

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

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

思路:按照上面的回溯模板进行回溯
时间复杂度:O(n^k) 空间复杂度:O(k)

解决方案:

class Solution {List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backTracking(n, k, 1, new LinkedList());return ans;}public void backTracking(int n, int k, int start, List<Integer> path) {if(path.size() == k) {ans.add(new ArrayList(path));return;}for(int i = start; i <= n; i++) {path.add(i);backTracking(n, k, i + 1, path);path.remove(path.size() - 1);}}
}

小结:这种不经减枝的算法时间十分耗时:

其实经过观察可以发现有一些组合从一开始就可以不去遍历. 这里用 Carl 哥的图片说明:

class Solution {List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backTracking(n, k, 1, new LinkedList());return ans;}public void backTracking(int n, int k, int start, List<Integer> path) {if(path.size() == k) {ans.add(new ArrayList(path));return;}for(int i = start; i <= n - (k - path.size() - 1); i++) {path.add(i);backTracking(n, k, i + 1, path);path.remove(path.size() - 1);}}
}

总结

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

代码随想录算法训练营第二十四天 | 理论基础、77. 组合相关推荐

  1. 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

    LeetCode 216.组合总和III 链接:216. 组合总和 III 思路: 这道题目与77. 组合仅有一点不同,就是这道题目找到的组合的总和需要满足额外的条件.所以在递归终止条件里增加了一个条 ...

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

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

  3. 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合

    目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...

  4. 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和

    代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...

  5. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。

    代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...

  6. 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

  7. 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II

    代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...

  8. _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II

    _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...

  9. 代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和。

    代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和. 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 454.四数相加I ...

最新文章

  1. springclould feign客户端添加全局参数
  2. 工业物联网时代,这五大职业跻身新热门
  3. QTime使用中遇到的”not enough actual parameters for macro 'min'“问题
  4. Windows 编程[5] - 学习窗体生成的过程五
  5. java 利用dfs生成简单的随机迷宫(效率不高)
  6. 动态规划/贪心总结(一)
  7. c语言环境窗口组成,如何搭建C语言环境
  8. List、Map、Set之间的联系与区别:
  9. mysql数据库密码修改
  10. UI自动化:单元测试框架
  11. 关于LoadRunner的Snapshots
  12. 普通用户登录PLSQL后提示空白OK对话框错误
  13. C语言:利用指针编写程序,将一个一维数组a[10]中的最大元素与第一个元素互换、将最小元素与最后一个元素互换
  14. 几何分布的众数为什么是1
  15. c语言1076素数,九度OJ 1076:N的阶乘 题解
  16. 基于yake的中文关键词提取试验
  17. UBUNTU上打字练习软件
  18. HT1621B驱动液晶LCD连接及程序
  19. 【Linux】_面试题之权限、ACL、磁盘空间管理、VDO、SELinux、逻辑卷、服务管理、防火墙策略、故障修复i
  20. xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

热门文章

  1. 回首百年科技 ——世纪之交的历史总结与哲学分析
  2. Mac版 Xcode+Tagent+airtest环境搭建
  3. stata统计分析及行业应用案例分析_数据分析之路(二)——描述性统计分析和应用案例...
  4. kafka消息队列的两种模式
  5. java 取得webcontent_JAVA JSP WebContent
  6. 机器视觉系列3:VS2019 OpenCV环境配置
  7. Java设计模式:享元模式
  8. java Excel 自动调整列宽
  9. 活动开始和截止时间倒计时
  10. 母亲将患感冒婴儿扔下楼后跳楼(图)