代码随想录day24 开启回溯算法

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

个人见解

感觉回溯算法其实和递归很像,也是用递归的做法,也有三部曲,但又不太一样的地方是递归中类似二叉树,只有纵向遍历(一层层往下遍历,没有横向遍历),而回溯算法中多的for循环就是横向遍历,说实话这一点我没有理解的太深,只是知道它类似于两个for循环中的第一个for循环,以后有更深的理解以后再来补全吧,先给出递归三部曲写法:
1、确定函数名和参数 void backTracking(参数)

2、确定终止条件,并在终止条件里存放结果和return

        if(终止条件){

                存放结果;

                return;

        }

3、确定单层递归逻辑

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

第77题. 组合

题目

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

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

思考

晕乎,虽说看了基础三部曲,但还是没啥头绪应该怎么写,卡在了终止条件上,看完卡哥的视频才恍然大悟,其实就是当临时vector存好元素后,将其放入res里,然后在单层递归的逻辑里迷糊于啥时候回溯pop_back(),应该是在终止条件return的时候

代码

class Solution {

public:

    vector<vector<int>> res;

    vector<int> path;

    void backTracking(int n, int k, int startIndex) {

        if(path.size() == k) {

            res.push_back(path);

            return;

        }

        for(int i = startIndex; i <= n; i++) {

            path.push_back(i);

            backTracking(n,k,i+1);

            path.pop_back();

        }

    }

    vector<vector<int>> combine(int n, int k) {

        backTracking(n,k,1);

        return res;

    }

};文章来源地址https://www.toymoban.com/news/detail-795197.html

到了这里,关于代码随想录day24 开启回溯算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 代码随想录-回溯算法(分割问题)|ACM模式

    目录 前言: 131. 分割回文串 题目描述: 输入输出描述: 思路和想法: 93. 复原 IP 地址 题目描述: 输入输出描述: 思路和想法:          回溯算法中的分割问题,是可以抽象为组合问题的,其中模拟切割线、切割问题中递归如何终止以及递归循环中如何截取子串,是我们

    2024年02月15日
    浏览(31)
  • 代码随想录-回溯算法(子集问题)|ACM模式

    目录 前言: 78. 子集 题目描述: 输入输出描述: 思路和想法: 90. 子集 II 题目描述: 输入输出描述: 思路和想法: 491. 递增子序列 题目描述: 输入输出描述: 思路和想法: 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话, 那么组合问题和分割问题都是收集

    2024年02月15日
    浏览(25)
  • 代码随想录Day4 | 链表02-leetcode24、19、面试题02.07、142

    题目链接:两两交换链表中的节点 思路: 双指针p1、p2,分别指向每次需要交换的节点。交换过程为p2的next指向p1,p1的next指向p2的next, 还需要注意将p1de前一个指针指向交换后的p2以确保不断链 。 1. 空链 or 只有头结点? - 直接返回head,无需做任何修改 2. 交换需要记录前驱

    2024年02月12日
    浏览(25)
  • 代码随想录day31 贪心算法初探

            就像卡哥视频里说的一样,感觉贪心算法确实没什么固定的套路,唯一的思路就是求局部最优解然后推广到全局最优解,但是什么是局部最优解,这个需要慢慢做题来摸索总结,有点像调参,蛮玄学的,纯考脑子 假设你是一位很棒的家长,想要给你的孩子们一些

    2024年01月18日
    浏览(29)
  • 代码随想录算法训练day4 | 链表

    目录 24. 两两交换链表节点 19. 删除链表倒数第n个节点 方法一:普通写法 方法二:双指针法 面试题:找链表相交节点 142. 判断环形链表 虚拟头节点的本质意义在于减少了特殊情况的处理。不用判断该节点是否在链表的第一位。 定义快慢两个指针。 fast先走n步,再让fast和s

    2024年02月04日
    浏览(35)
  • 代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(27)
  • 代码随想录——回溯

    代码随想录——回溯 回溯的本质就是递归遍历,但在完成某一条路之后会撤回到上一层,然后重新选择另一条路继续遍历,是一个比较低效的算法,能进行提升的方式就是剪枝。 组合 链接:https://leetcode.cn/problems/combinations/description/ vectorvector int 作为最终返回的结果,vector

    2024年01月19日
    浏览(30)
  • 【一天三道算法题】代码随想录——Day15(困难题只有一道)

    一. 滑动窗口最大值 题目链接:力扣 思路:         这道题我认为最难的是编程语言本身并没有一个可以让你完全直接开始使用的一个数据结构,也就是说要自己造轮子。并且为了尽可能的减少维护元素的个数我们要学会去在能实现功能的前提下,维护尽可能少的数组元

    2024年02月15日
    浏览(24)
  • 代码随想录二刷 |回溯 |分割回文串

    131.分割回文串 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ] 回溯三部曲 递归函数参数 全局变量数组path存放切割后回文的子串,二维数组result存放结果集 参数

    2024年01月24日
    浏览(28)
  • 代码随想录阅读笔记-回溯【电话号码的字母组合】

    题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:\\\"23\\\" 输出:[\\\"ad\\\", \\\"ae\\\", \\\"af\\\", \\\"bd\\\", \\\"be\\\", \\\"bf\\\", \\\"cd\\\", \\\"ce\\\", \\\"cf\\\"]. 说明:尽管上面的答案是按字典序排列的,但是你可以任意

    2024年04月13日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包