回溯递归(例题+思路+代码)

这篇具有很好参考价值的文章主要介绍了回溯递归(例题+思路+代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目描述

leetcode 77

回溯递归(例题+思路+代码)

思路

组合问题适合用回溯求解。

经典解法:for循环 + 内部回溯。

每次进入回溯方法时,先判断终止条件,再进行当前层的循环,循环进行下一层递归。

代码

class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        List<Integer> tempResult = new ArrayList<Integer>();
        dfs(result, tempResult, 1, n, k);
        return result;
    }

    public void dfs(List<List<Integer>> result, List<Integer> tempResult, int start, int n, int k) {
        if(tempResult.size() == k) {
            result.add(new ArrayList<Integer>(tempResult));
            return;
        }
        for(int i = start; i <= n; i ++) {
            tempResult.add(i);
            dfs(result, tempResult, i + 1, n, k);
            tempResult.remove(tempResult.size() - 1);
        }
    }
}

剪枝

由于递归本质其实就是暴力解法,所以会经过许多没有必要的节点。

该题中,如果n=4,k=3,那么在第二层中的3和4都是没有必要再经过的,所以需要剪枝。

具体只需要把for循环中判断条件改为i <= n - (k - tempResult.size()) + 1即可。

深拷贝和浅拷贝

现象:

在将List<Integer> tempResult添加进List<List<Integer>> result

如果直接add,最终每个list中结果都为空。

必须result.add(new ArrayList<Integer>(tempResult))

原因:

原因在于前者是浅拷贝,相当于把每个List<Integer> tempResult的地址值作为一个元素拷贝给List<List<Integer>> result。所以当后续修改tempResult时,结果集中的每个元素的值也会随之修改。

关于深拷贝和浅拷贝详情请看这篇博文:深拷贝和浅拷贝文章来源地址https://www.toymoban.com/news/detail-417974.html

到了这里,关于回溯递归(例题+思路+代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

    一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决 组合问题 、 排列问题 、 选择问题 等一类问题的常用算法。它通过尝试所有可能的选择来找到问题的解,当发现当前选择不符合要求时,就回溯到之前的状态,然后尝试其他的选择。 1、基本思想: 从问题的起

    2024年02月11日
    浏览(45)
  • 数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)

    目录 题目描述 输入示例 输出示例 解题思路  解题方法(C语言) 解析 有序的二叉树遍历可以用堆栈以非递归的方式实现。 例如: 假设遍历一个节点数为6的二叉树(节点数据分别为1到6)时, 堆栈操作为:push(1);push(2);push(3);pop();pop();push(4);pop()

    2024年02月07日
    浏览(50)
  • 数据结构例题代码及其讲解-递归与树

    ​ 树的很多题目中都包含递归的思想 递归 递归包括 递归边界 以及 递归式 即:往下递,往上归 递归写法的特点: 写起来代码较短,但是时间复杂度较高 01 利用递归求解 n 的阶乘。 02 斐波那契数列是满足 F(0)=1,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)的数列,数列的前几项为 1,1,2,

    2024年02月09日
    浏览(55)
  • 区间合并(超详细逐步讲解/例题/思路分析/参考代码)

    我们要了解区间合并是什么,首先来看这样的一个例子。 区间2是区间1的一个子区间 区间3和区间1有交集 区间4和区间1端点在同一个点上 区间5和区间1没有交集 所以区间2,3,4都可以和区间1合并形成一个新的区间,区间5则不行。 总结:区间合并就是把多个区间有交集的部分

    2024年02月14日
    浏览(40)
  • 数据结构链表力扣例题AC(2)——代码以及思路记录

    给你单链表的头节点  head  ,请你反转链表,并返回反转后的链表。 AC方法1 代码思路 观察示例,1-2-3-4-5 == 5-4-3-2-1 要将箭头的方向都旋转,假设从左向右改变,第一步2-1,用两个指针 n1 和 n2 分别指向1和2,使 n2 指向 n1 就可以实现了,但是此时由于 2 之前保存的 3 的地址,

    2024年02月21日
    浏览(45)
  • 代码随想录Day20 回溯算法 LeetCode77 组合问题

    以下内容更详细解释来自于:代码随想录 (programmercarl.com) 回溯法也叫回溯搜索法,是搜索法的一种,我们之前在二叉树中也经常使用到回溯来解决问题,其实 有递归就有回溯 ,有的时候回溯隐藏在递归之下,我们不容易发觉,今天我们来详细介绍一下什么是回溯,它能解决哪些问题.

    2024年02月08日
    浏览(54)
  • 数据结构学习记录——图应用实例-拯救007(问题描述、解题思路、伪代码解读、C语言算法实现)

    目录 问题描述  解题思路 伪代码  总体算法 DFS算法 伪代码解读 总体算法 DFS算法 具体实现(C语言) 在老电影“007之生死关头”(Live and Let Die)中有一个情节,007被毒贩抓到一个鳄鱼池中心的小岛上,他用了一种极为大胆的方法逃脱 —— 直接踩着池子里一系列鳄鱼的大脑

    2024年02月05日
    浏览(78)
  • 回溯算法例题(剪枝策略)

    链接: 77. 组合 链接: 216. 组合总和 III 链接: 17. 电话号码的字母组合 链接: 39. 组合总和 注:使用剪枝必须对原数组进行排序 链接: 40. 组合总和 II 链接: 131. 分割回文串 链接: 93. 复原 IP 地址 链接: 78. 子集 链接: 90. 子集 II 链接: 46. 全排列 链接: 47. 全排列 II 链接: 51. N 皇后 链接

    2024年02月04日
    浏览(89)
  • 专题一:递归【递归、搜索、回溯】

    什么是递归 函数自己调用自己的情况。 为什么要用递归 主问题-子问题        子问题-子问题 宏观看待递归 不要在意细节展开图,把函数当成一个黑盒,相信这个黑盒一定能完成任务。  如何写好递归   分析跟上一题差不多,不详解。 实现 pow(x, n) ,即计算  x  的整

    2024年02月07日
    浏览(44)
  • 递归、搜索与回溯算法(专题一:递归)

    往期文章(希望小伙伴们在看这篇文章之前,看一下往期文章) (1)递归、搜索与回溯算法(专题零:解释回溯算法中涉及到的名词)【回溯算法入门必看】-CSDN博客 接下来我会用几道题,来让同学们利用我在专题零中提到的 递归的宏观思想 来解决这些题目。 目录 1. 汉诺

    2024年01月25日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包