![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
#代码随想录学习打卡
文章平均质量分 87
学习代码随想录基础知识点与经典题目
小小小码猿
这个作者很懒,什么都没留下…
展开
-
动态规划7:打家劫舍、打家劫舍||、打家劫舍|||、买卖股票的最佳时机、第7节总结
打家劫舍:只考虑两个相邻的不能一起偷所以dp[i]就由dp[i-1](偷了上一个不偷这个)和dp[i-2]+nums[i](偷了前两个,前一个不偷,再偷这个)这两个前面节点偷的状态决定。打家劫舍||:头尾相连巧妙解法:把数组分为两个子数组,分别包含头和尾,找这两个子数组的最大偷盗金额。打家劫舍|||:数组变成二叉树了,所以要遍历二叉树。并且父节点和孩子不能同时偷。首先判断要后序遍历,然后分两种情况,偷父节点与不偷父节点,分别加金额。股票买卖的最佳时间:所有天数里只能选择一天买入,一天卖出。原创 2023-10-25 11:39:42 · 81 阅读 · 0 评论 -
动态规划6:单词拆分、多重背包理论基础、背包问题总结
背包问题分类最重要的是:将问题抽象为背包问题,并记住动规五部曲确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组。原创 2023-10-24 20:33:31 · 43 阅读 · 0 评论 -
动态规划5:组合总和Ⅳ、爬楼梯(进阶版)、零钱兑换、完全平方数、第五节总结
组合总和Ⅳ给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数(顺序不同的序列被视作不同的组合)。这个题就是完全背包的排列问题,需要先遍历背包再是物品爬楼梯(进阶版)其实就是一个完全背包问题,在1-m的数中重复选择和为n的排列组合。零钱兑换给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数(每种硬币的数量是无限的)。这个题需要注意的是求最少个数。且当前个数依赖于减去当前硬币的个数加一。原创 2023-10-21 17:14:08 · 109 阅读 · 0 评论 -
动态规划8:买卖股票的最佳时机||、买卖股票的最佳时机|||、买卖股票的最佳时机Ⅳ,最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费、股票问题总结
只能买卖一次:这个问题只需要遍历的时候更新最小买入价格和最大卖出价值即可。可以买卖无数次:第i天有买入和卖出两个状态。每个状态可以由前一天买卖与否的两个状态推出。只能买卖2次:第i天有5种状态(无操作、第一次持有、第一次不持有、第二次持有、第二次不持有),每种状态都由前一天买卖与否决定。只能买卖k次:第i天一共有2*k+1次状态,对于每种状态像上一题一样处理。注意持有和不持有的初始化卖出的后一天为冷冻期:这时第i天有四种状态(持有、当天保持不持有状态、当天卖出、冷冻期)原创 2023-11-02 20:02:25 · 192 阅读 · 0 评论 -
动态规划4:目标和、一和零、完全背包理论、零钱兑换||、第4节总结
目标和难点是想到背包的容量是left,因为sum和target固定,所以left=(sum+target)/2。并且还要想到sum和target同奇同偶可以剪枝。所以,题目就转换为了在容量为left的背包中,和为left的组合数。一和零一个字符串数组中的每个字符串的1、0个数,找到满足m个0,n个1的最长子集数。dp[i][j]表示满足(小于等于)i个0和j个1的字符串个数。dp[i][j]应该由去掉当前字符串的01个数后的个数+1,与本身的最大值决定。原创 2023-10-17 20:47:47 · 94 阅读 · 0 评论 -
动态规划2:不同路径、不同路径||、整数拆分、不同的二叉搜索树、第2节总结
不同路径:首先要想清楚dp[i][j]的含义,并且想清楚dp[i][j]可以由左节点和上节点得到。不同路径||:中间有障碍的dp为0,第一列和第一行一旦出现障碍,其后都为0。整数拆分:想清楚dp[i]是由i/2到i-1区间内的dp和i的最大值*(i-该数)得到,最好用例子推演。不同的二叉搜索树:这道题较难,需要画图推算,并且很难想到每一个节点下的布局是上一个节点布局,且总个数是左右子树布局的乘积。原创 2023-10-11 17:39:47 · 704 阅读 · 0 评论 -
动态规划1:理论基础、斐波那契数、爬楼梯、使用最小花费爬楼梯、第一节总结
动态规划(Dynamic programming),简称DP。如果面对一个问题有很多重叠子问题,使用动规很有效。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。举一个例子说明动规和贪心的区别。例如:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。原创 2023-10-10 20:28:41 · 37 阅读 · 0 评论 -
动态规划3:01背包理论基础|、01背包理论基础||、分割等和子集、最后一块石头的重量||、第三节总结
二维dp和一维dp有着很大的区别,空间复杂度降低一个数量级。遍历的方向不一样:二维可以先物品再背包,也可以先背包再物品。而一维只能先物品再背包,因为是对二维数组的压缩,是为了防止在dp[j]下只能添加一个物品。背包的起始和终止条件不同:二维0<=j<=n,从0到n的正序遍历。而一维是从j=n开始到j>=n-weight[i]的倒序遍历,是为了防止将物品重复放入。递推公式随着数组的压缩发生变化。例题1049:有一堆石头,用整数数组 stones 表示。原创 2023-10-12 19:13:33 · 76 阅读 · 0 评论 -
贪心算法:单调递增的数字、监控二叉树、贪心算法总结
贪心很简单,就是常识?跟着一起刷题的录友们就会发现,贪心思路往往很巧妙,并不简单。贪心有没有固定的套路?贪心无套路,也没有框架之类的,需要多看多练培养感觉才能想到贪心的思路。究竟什么题目是贪心呢?Carl个人认为:如果找出局部最优并可以推出全局最优,就是贪心,如果局部最优都没找出来,就不是贪心,可能是单纯的模拟。(并不是权威解读,一家之辞哈)但我们也不用过于强调什么题目是贪心,什么不是贪心,那就太学术了,毕竟学会解题就行了。如何知道局部最优推出全局最优,有数学证明么?原创 2023-09-25 17:14:01 · 85 阅读 · 0 评论 -
贪心算法:用最少数量的箭引爆气球、无重叠空间、划分字母区间、合并区间、贪心周总结
用最少数量的箭引爆气球:求重叠区间的最大个数判断两气球是否重叠,如果重叠需要用一支箭,并更新这个重叠区间的右边界为两气球中的较小值。否则,直接跳过。无重叠区间:去掉的最少区间数,让所有的区间不重叠和上一题类似,找到重叠的区间,一旦找到重叠区间,就更新这个重叠区间的右边界为两气球中的较小值,因为较大值可能与下一个重叠,如果不去掉又会重复计算。如果直接找不重叠区间,则一旦出现重叠区间保留右边界为较小值。划分字母区间:将字母划分为尽可能多的片段,同一个字母最多出现在一个片段中。原创 2023-09-22 16:05:22 · 87 阅读 · 0 评论 -
贪心算法:加油站、分发糖果、柠檬水找零、根据身高重建队列、周总结
例题134:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。如果存在解,则 保证 它是 唯一 的。局部最优:每次选择gas-cost>=0的加油站出发,整体最优:使得油量可以满足加油站。原创 2023-09-19 19:11:34 · 40 阅读 · 0 评论 -
贪心算法:分发饼干、摆动序列、最大子序和
贪心没有套路,就是常识性推导加上反举例。贪心的本质是在每个阶段选择局部最优解,推出全局最优解。分发饼干:局部最优就是小饼干优先喂给胃口小的,这样可以保证剩下来的是大饼干。时间复杂度是O(nlgn),由于快排是O(nlgn),遍历是O(n),所以合起来还是这么多。最长摆动序列:局部最优解是有尽可能多的局部峰值,删除单调坡度上的节点(不包括坡度两端),那么这个坡度就可以有两个局部最优峰值。整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列。最大子序列。原创 2023-09-15 15:15:10 · 258 阅读 · 0 评论 -
贪心算法:买卖股票的最佳时机||、跳跃游戏、跳跃游戏||(较难)、K次取反后最大化的数组和、周总结
买卖股票的最佳时机:相邻两天的利润,局部最优:只取正利润表明这段时间区间内的利润,全局最优:达到最大的利润。不考虑多久买多久卖,只需要找到所有的正利润。跳跃游戏:判断是否可以达到终点?用cover记录最长覆盖区间,每走一步判断最长覆盖区间是否需要更新。如果覆盖区间能超过或等于数组长度-1,那么就能到达。需要注意的是,步伐i是在每一步的覆盖区间cover内变化。跳跃游戏||:找到达到终点的最小步数。该题比上一题更难。需要注意的是,该题也需要最大覆盖区间来判断步数。原创 2023-09-18 21:51:06 · 136 阅读 · 0 评论 -
回溯4:去重另一种写法、重新安排行程、N皇后、解数独
回溯是递归的副产品,只要有递归就有回溯,所有回溯法经常和二叉树遍历、深度优先遍历混在一起,因为这两种方式都用了递归。回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集棋盘问题:N皇后,解数独等等oid backtracking(参数) {if (终止条件) {存放结果;return;原创 2023-08-04 19:57:52 · 64 阅读 · 0 评论 -
回溯3:子集||、递增子序列、全排列、全排列||
1.求子集问题:子集问题是收集所有节点,组合切割问题是收集叶子节点。2.递增子序列:去掉同一层重复出现的元素,需要用哈希表或数组记录同层元素的出现情况,并对每一层设置used数组。3.排列问题(无重复数组):每层都是从0开始而不是startIndex,需要used记录path里放了哪些元素。4.排列问题||(重复数组):需要对for循环中重复元素去重,以及每层从0开始跳过自身。原创 2023-07-29 20:58:18 · 70 阅读 · 0 评论 -
回溯算法2:组合总和、组合总和||、分割回文串、复原IP地址
1.回溯的组合总和|| 和第一周的组合问题不同。这题没有数量要求,可以无限重复,但是有总和的限制,所以间接也是个数的限制。2.组合总和||| 依旧是元素重复,但解集不能有重复的组合。难点就在于去重。去重分为树枝去重和树层去重。都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,一个维度是同一树枝上“使用过”,一个维度是同一树层上“使用过”。没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。原创 2023-07-28 21:14:53 · 63 阅读 · 0 评论 -
回溯算法1:回溯理论、组合问题、组合优化、电话号码的字母组合
1.什么是回溯法?回溯法是递归的副产品,只要有递归就会有回溯。回溯其实就是暴力解,列出所以的答案,选择满足需要的,最多剪枝优化。组合问题:从N个数中按照一定规则选择K个数的集合。排列问题:N个数按照一定规则全排列,有几种排列方式。切割问题:一个字符串按一定的规则有几种切割方式。子集问题:一个N个数的集合里有多少符合条件的子集。棋盘问题:N皇后,解数独等。2.回溯法求组合问题(求同个集合间的组合)用递归控制for循环嵌套的数量。原创 2023-07-19 19:34:52 · 179 阅读 · 0 评论 -
二叉树总结
二叉树构造最麻烦的问题就是什么遍历顺序,无论是什么二叉树,涉及到构造一定是前序遍历,先构造中间节点。求普通二叉树的属性,一般是后序。求二叉搜索树的属性,一般是中序。转载 2023-07-11 17:24:57 · 34 阅读 · 0 评论 -
二叉树习题5:二叉搜索树的最近公共祖先、二叉搜索树中的插入操作、删除二叉搜索树中的节点、修剪二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换成累加树
例题235:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。除了可以利用普通二叉树的最近公共祖先的代码,要知道二叉搜索树是有特性的,那就是左右子树分别小于大于根节点。因此,在二叉搜索树中,如果一个节点处于P和q的取值区间内,那么该节点就有可能是公共祖先,这就是最近的祖先吗?原创 2023-07-11 16:03:50 · 45 阅读 · 0 评论 -
二叉树习题4:合并二叉树、二叉搜索树中的搜索、验证二叉树、二叉搜索树的最小绝对差、二叉搜索树中的众数、二叉树的最近公共祖先
1.合并二叉树:同时处理两个树的节点,可以新建一个树,但更好的是直接在原来的一棵树上操作。可以用层序、递归、迭代遍历两个二叉树,重要的就是在遍历的过程中处理节点。2.二叉搜索树:碰到二叉搜索树就牢记:中序遍历就是在有序数组上操作。3.验证二叉搜索树:暴力法:中序遍历得到一个递增数组。递归比较时,不光是左节点右节点小于或大于根节点,而是左子树右子树都要小于或大于根节点。原创 2023-07-06 17:01:34 · 83 阅读 · 1 评论 -
动态规划:01背包(滚动数组)
以上的讲解可以开发一道面试题目(毕竟力扣上没原题)。就是本文中的题目,要求先实现一个纯二维的01背包,如果写出来了,然后再问为什么两个for循环的嵌套顺序这么写?反过来写行不行?再讲一讲初始化的逻辑。然后要求实现一个一维数组的01背包,最后再问,一维数组的01背包,两个for循环的顺序反过来写行不行?为什么?注意以上问题都是在候选人把代码写出来的情况下才问的。就是纯01背包的题目,都不用考01背包应用类的题目就可以看出候选人对算法的理解程度了。转载 2023-05-22 16:46:42 · 171 阅读 · 0 评论 -
二叉树习题3:左叶子之和、找树左下角的值、路径总和、路径总和||、从中序与后序遍历序列构造二叉树、从前序与中序遍历序列构造二叉树、最大二叉树
二叉树第三周习题练习,包括构造二叉树、递归与回溯的联系、递归返回值的确定等原创 2023-07-03 15:00:20 · 84 阅读 · 1 评论 -
二叉树理论基础
int val;与链表定义类似,有两个指针,分别指向左右孩子。二叉树是一种基础数据结构,也是众多数据结构的基石。本章节介绍了二叉树的种类、存储方式、遍历方式、定义等基础概念。二叉树中不得不提到的就是递归,要掌握递归代码的写法。转载 2023-06-08 17:23:10 · 45 阅读 · 0 评论 -
二叉树习题2:翻转二叉树、N叉树的前序遍历、N叉树的后序遍历、对称二叉树、相同的树、另一颗树的子树、二叉树的最大深度、二叉树的最小深度、N叉树最大深度、完全二叉树的节点个数、平衡二叉树、二叉树所有路径
例题226:给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。层序遍历二叉树直接交换每一个节点的左右孩子。原创 2023-06-15 17:09:04 · 47 阅读 · 0 评论 -
二叉树递归(c++)、非统一和统一的前中后序迭代遍历(Java)、层序遍历(Java)
递归三要素:1.确定递归函数的参数和返回值:确定哪些参数是递归过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。2.确定终止条件:写完递归算法,运行时,经常遇到栈溢出的情况,就是没写终止条件或者终止条件写得不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必定溢出。3.确定单层递归的逻辑:确定每一层递归需要处理的信息,在这里也就会重复调用自己来实现递归的过程。在递归过程中,怎么算递归结束呢?原创 2023-06-13 20:30:10 · 114 阅读 · 0 评论 -
栈与队列:理论基础、用栈实现队列、用队列实现栈、有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值、滑动窗口最大值(难点)、前k个高频元素(难点)
首先了解栈和队列的理论基础,提到四个问题:1.C++中stack、queue是容器码?——>它们是容器适配器2.使用的stack、queue是属于哪个版本的STL?——>SGI STL是开源的3.使用的STL中的stack、queue是如何实现的?——>底层采用deque、list、链表等向外提供接口实现功能4.stack、queue提供迭代器来遍历空间吗?——>不提供面试题:栈里面的元素在内存中是连续分布的吗?原创 2023-06-07 15:19:57 · 86 阅读 · 0 评论 -
双指针:移除元素、反转字符串、替换空格、翻转字符里的单词、翻转链表、删除链表的倒数第N个节点、链表相交、环形链表、三数之和(较难)、四数之和
移除元素或翻转数组,用双指针在一个for循环下完成两个for循环的工作。原创 2023-05-15 20:29:39 · 146 阅读 · 0 评论 -
动态规划:二维01背包问题
详细讲解二维背包得来的5个步骤转载 2023-05-22 15:38:22 · 1435 阅读 · 4 评论 -
字符串——反转字符串、反转字符串||、替换空格、翻转字符串里的单词、左旋转字符串、实现strStr()、重复的子字符串、总结
C语言中使用'\0'作为字符数组的结束标志,例如a[i]!= '\0';i++) {C++中提供一个string类,string类会提供size接口,判断string字符串是否结束,就不用使用'\0'判断,例如i++) {那么vector< char > 和 string 又有什么区别呢?其实在基本操作上没有区别,但是 string提供更多的字符串处理的相关接口,例如string 重载了+,而vector却没有。原创 2023-04-24 19:31:12 · 156 阅读 · 0 评论 -
哈希表习题——四数相加||、赎金信、三数之和、四数之和、总结
一般来说哈希表是用来快速判断某个元素是否出现在一个集合中清楚哈希函数和哈希碰撞在哈希表中的作用哈希函数是将传入的key映射到索引上哈希碰撞是指有多个key映射到相同的索引上的情况,可以用拉链法(后接链表)和线性探测法(后空索引地址存放碰撞元素)解决哈希表有三种数据结构,分别是数组、set、map,需要了解它们各自的底层逻辑,以及各自适用的场景数组一般有大小限制,且方便索引与key之间的映射,map需要哈希函数转换并且空间占用更大。原创 2023-04-20 21:58:30 · 60 阅读 · 0 评论 -
哈希表习题:有效的字母异位词、两个数组的交集、快乐数、两数之和
242题:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1: 输入: s = “anagram”, t = “nagaram” 输出: true示例 2: 输入: s = “rat”, t = “car” 输出: false说明: 你可以假设字符串只包含小写字母数组就是一个简单的哈希表题目383:给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true;原创 2023-04-17 10:23:29 · 105 阅读 · 0 评论 -
哈希表基础知识
哈希表是根据关键码的值直接进行访问的数据结构一般哈希表都是用来快速判断一个元素是否出现集合里。转载 2023-04-13 19:44:55 · 43 阅读 · 0 评论 -
链表篇习题:移除链表元素、翻转链表、两两交换链表中的节点、删除链表中倒数第N个节点、链表相交、环形链表||
移除链表元素、链表增删改查、翻转链表、删除倒数第N个节点、链表相交、环形链表等经典题目原创 2023-03-30 22:09:12 · 166 阅读 · 0 评论 -
链表——理论基础篇
/链表定义int val;//链表节点上存储的元素//指向下一节点的指针ListNode(int x):val(x),next(NULL){}//节点的构造函数(c++会默认生成的构造函数不会初始化任何成员变量)使用C++默认的构造函数与上述自定义的构造函数两者的区别在于:①默认初始化节点,不能给变量赋值//默认构造函数②可以给变量赋值//自定义构造函数。转载 2023-03-28 20:44:57 · 73 阅读 · 0 评论 -
代码随想录-数组部分总结
代码随想录数组部分总结原创 2023-03-23 21:40:42 · 90 阅读 · 0 评论 -
代码随想录-数组(有序数组的平方,最小长度子序列、螺旋矩阵)
代码随想录数组部分(数组平方排序、长度最小子序列、螺旋数组)原创 2023-03-23 21:23:37 · 79 阅读 · 0 评论 -
数组:理论基础、二分查找、移除元素
二分查找、双指针法学习原创 2023-03-13 18:27:44 · 91 阅读 · 1 评论 -
学习代码随想录第一天
开始学习Carl大佬的代码随想录第一天,会持续更新学习进度转载 2023-01-20 17:13:12 · 98 阅读 · 0 评论