开发一个企业网站要多少钱,qq营销软件开发,织梦后台搭建网站并调用标签建设,做柜子喜欢上哪些网站看理论基础 其实在讲解二叉树的时候#xff0c;就给大家介绍过回溯#xff0c;这次正式开启回溯算法#xff0c;大家可以先看视频#xff0c;对回溯算法有一个整体的了解。 题目链接/文章讲解#xff1a;代码随想录 视频讲解#xff1a;带你学透回溯算法#xff08;理论篇… 理论基础 其实在讲解二叉树的时候就给大家介绍过回溯这次正式开启回溯算法大家可以先看视频对回溯算法有一个整体的了解。 题目链接/文章讲解代码随想录 视频讲解带你学透回溯算法理论篇| 回溯法精讲_哔哩哔哩_bilibili 77. 组合 对着 在 回溯算法理论基础 给出的 代码模板来做本题组合问题大家就会发现 写回溯算法套路。 在回溯算法解决实际问题的过程中大家会有各种疑问先看视频介绍基本可以解决大家的疑惑。 本题关于剪枝操作是大家要理解的重点因为后面很多回溯算法解决的题目都是这个剪枝套路。 题目链接/文章讲解代码随想录 视频讲解带你学透回溯算法-组合问题对应力扣题目77.组合| 回溯法精讲_哔哩哔哩_bilibili 剪枝操作带你学透回溯算法-组合问题的剪枝操作对应力扣题目77.组合| 回溯法精讲_哔哩哔哩_bilibili 时间复杂度: O(n * 2^n)
空间复杂度: O(n)ListListInteger result new ArrayList();LinkedListInteger path new LinkedList();public ListListInteger combine(int n, int k) {backtracking(n,k,1);return result;}public void backtracking(int n,int k,int startIndex){if (path.size() k){result.add(new ArrayList(path));return;}for (int i startIndex;in;i){path.add(i);backtracking(n,k,i1);path.removeLast();}} 剪枝 可以剪枝的地方就在递归中每一层的for循环所选择的起始位置。 如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了那么就没有必要搜索了。 ListListInteger result new ArrayList();LinkedListInteger path new LinkedList();public ListListInteger combine(int n, int k) {combineHelper(n, k, 1);return result;}/*** 每次从集合中选取元素可选择的范围随着选择的进行而收缩调整可选择的范围就是要靠startIndex* param startIndex 用来记录本层递归的中集合从哪里开始遍历集合就是[1,...,n] 。*/private void combineHelper(int n, int k, int startIndex){//终止条件if (path.size() k){result.add(new ArrayList(path));return;}for (int i startIndex; i n - (k - path.size()) 1; i){path.add(i);combineHelper(n, k, i 1);path.removeLast();}}