代码随想录算法训练营第二十四天 | 理论基础、77. 组合
学习目标
- 学习回溯算法理论基础, 并进行练习
学习内容
回溯算法理论基础
文章链接:回溯算法理论基础
小结:回溯算法模板:
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);}}
}
总结
- 记住回溯的模板:
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}
- 考虑一下剪枝
代码随想录算法训练营第二十四天 | 理论基础、77. 组合相关推荐
- 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合
LeetCode 216.组合总和III 链接:216. 组合总和 III 思路: 这道题目与77. 组合仅有一点不同,就是这道题目找到的组合的总和需要满足额外的条件.所以在递归终止条件里增加了一个条 ...
- 代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合
77组合 看完题后的思路 void f(数组,startIndex) 递归终止 if(startIndex数组长度||path.sizek){ if(path.size==k){ 加入} } 递归 f ...
- 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合
目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...
- 代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和
代码随想录算法训练营day6| 454.四数相加II 383.赎金信 15.三数之和 18.四数之和 LeetCode 454 四数相加II 题目链接: 454.四数相加II class Soluti ...
- 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II。
代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II. 977.有序数组的平方 209. 长度最小的子数组 59. 螺旋矩阵 II 977.有序数组的 ...
- 代码随想录算法训练营第二天 | 力扣977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II
代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...
- 代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II
代码随想录算法训练营第二天 | LeetCode977.有序数组的平方 ,209.长度最小的子数组,59.螺旋矩阵II 一. LeetCode977.有序数组的平方 1. 题目链接[LeetCode9 ...
- _28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II 、55.跳跃游戏、45.跳跃游戏II
_28LeetCode代码随想录算法训练营第二十八天-贪心算法 | 122.买卖股票的最佳时机II .55.跳跃游戏.45.跳跃游戏II 题目列表 122.买卖股票的最佳时机II 55.跳跃游戏 45 ...
- 代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和。
代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和. 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 454.四数相加I ...
最新文章
- springclould feign客户端添加全局参数
- 工业物联网时代,这五大职业跻身新热门
- QTime使用中遇到的”not enough actual parameters for macro 'min'“问题
- Windows 编程[5] - 学习窗体生成的过程五
- java 利用dfs生成简单的随机迷宫(效率不高)
- 动态规划/贪心总结(一)
- c语言环境窗口组成,如何搭建C语言环境
- List、Map、Set之间的联系与区别:
- mysql数据库密码修改
- UI自动化:单元测试框架
- 关于LoadRunner的Snapshots
- 普通用户登录PLSQL后提示空白OK对话框错误
- C语言:利用指针编写程序,将一个一维数组a[10]中的最大元素与第一个元素互换、将最小元素与最后一个元素互换
- 几何分布的众数为什么是1
- c语言1076素数,九度OJ 1076:N的阶乘 题解
- 基于yake的中文关键词提取试验
- UBUNTU上打字练习软件
- HT1621B驱动液晶LCD连接及程序
- 【Linux】_面试题之权限、ACL、磁盘空间管理、VDO、SELinux、逻辑卷、服务管理、防火墙策略、故障修复i
- xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx