![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
【数据结构与算法】秋招必备
文章平均质量分 82
算法秋招速通
xuwuuu
去改变世界吧~
展开
-
day11【栈与队列】 20.有效的括号 |1047.删除字符串中的所有相邻重复项 | 150.逆波兰表达式求值
思路:遍历字符串,当遇到所有的左括号时,往栈里存与其对应的右括号。当开始遇到右括号时,判断遇到的右括号是否和栈顶元素相同,相同的话就移除此栈顶元素,继续遍历判断下一个;题目解释:给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )。如果当字符串遍历完,栈中还有元素,代表字符串里有多余的左括号,没有右括号与之能配对。如果字符遍历到某处,栈中为空了,代表从此处开始,后面的字符都是多余的右括号了。原创 2023-05-21 17:33:07 · 44 阅读 · 1 评论 -
day10【栈与队列】 232.用栈实现队列 | 225.用队列实现栈
你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。原创 2023-05-21 14:27:20 · 58 阅读 · 1 评论 -
Day03【链表】203.移除链表元素 | 707.设计链表 | 206.反转链表
【链表】【双指针法】【递归法】原创 2023-05-14 18:19:17 · 92 阅读 · 0 评论 -
Day07 【哈希表】| 454.四数相加Ⅱ | 383.赎金信 | 15.三数之和 | 18.四数之和
满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]题目描述:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。再遍历C和D中的c+d的值,如果0-(c+d)的值在map的key中出现过,那么就找到了四数相加为0的一组,此时计数器要+key所对应的value。再遍历赎金信中的字母,在对应下标出让元素值 - -。原创 2023-05-16 23:31:03 · 88 阅读 · 1 评论 -
Day08【字符串】344. 反转字符串| 541. 反转字符串Ⅱ|剑指offer 05.替换空格|151.反转字符串中的单词|剑指offer58-Ⅱ. 左旋转字符串
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。这道题想了好久好久才转过弯来,估计以后还是要卡壳,用最简单傻瓜的语言做了注释,希望二刷的时候自己还能看得懂自己写的是啥。题目描述: 给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。思路:双指针,把数组内的元素收尾对调即可,但是需要一个temp来存换之前的原始的字符。题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。原创 2023-05-19 12:53:17 · 67 阅读 · 0 评论 -
Day09 【KMP,字符/双指针总结】一刷了解 | 28. 实现 strStr() | 459.重复的子字符串
代码随想录 | 讲解链接代码随想录 | 讲解链接。原创 2023-05-19 12:59:34 · 37 阅读 · 1 评论 -
算法训练Day01|704.二分查找 27.移除元素
【数组理论基础】【704.二分查找】【 27.移除元素】【双指针】原创 2023-05-10 23:07:45 · 138 阅读 · 1 评论 -
Day02 算法训练 977.有序数组的平方 | 209.长度最小的子数组 | 59.螺旋矩阵
【有序数组的平方】【长度最小的子数组】【螺旋矩阵】原创 2023-05-11 22:11:36 · 36 阅读 · 0 评论 -
day06【哈希表】242.有效的字母异位词 | 349.两个数组的交集 | 202.快乐数 | 1.两数之和
要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。但哈希法牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。如果在做面试题目的时候遇到需要判断一个元素是否出现过的场景也应该第一时间想到哈希法!原创 2023-05-15 21:23:57 · 132 阅读 · 1 评论 -
day14【二叉树】递归遍历、迭代遍历 144. 二叉树的前序遍历 | 145. 二叉树的后序遍历 | 94. 二叉树的中序遍历
链式存储的二叉树节点的定义方式int val;} }原创 2023-05-23 23:58:19 · 122 阅读 · 0 评论 -
day13【栈与队列】 239.滑动窗口最大值 | 347.前K个高频元素
题目解释:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。让人男默女泪的一道题。这次思路勉强能捋清楚,但是代码都是看着写的。看过之后能自己ac,但是估计后面铁定忘。返回滑动窗口中的最大值。原创 2023-05-22 23:24:24 · 26 阅读 · 0 评论 -
Day04【链表】24.两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 02.07.链表相交 | 142.环形链表Ⅱ
此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。否则循环退出返回空指针。题目描述:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。简单来说,就是求两个链表交点节点的指针。这里要注意,交点不是数值相等,而是。思路:推荐使用虚拟头结点,这样方便处理删除实际头结点的逻辑。为了方便举例,假设节点元素数值相等,则节点指针相等。原创 2023-05-14 21:36:58 · 75 阅读 · 1 评论 -
day29 【回溯算法】491.递增子序列 | 46.全排列 | 47.全排列Ⅱ
题意:给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。原创 2023-06-29 23:41:10 · 72 阅读 · 0 评论 -
DAY22 【二叉树】235. 二叉搜索树的最近公共祖先 | 701.二叉搜索树中的插入操作 | 450.删除二叉搜索树中的节点
左子树上的元素比删除的元素小,而右子树的元素都比删除的元素大。那么可以把左子树放到右子树的最左侧的叶子节点下(也就是右子树中最小的元素,也比所有的左子树大)题意:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。题意:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。让删除的节点的父节点直接指向要删除节点的其右孩子。情况3:要删的节点的左孩子不空,右孩子为空。让删除的节点的父节点直接指向要删除节点的其左孩子。原创 2023-06-12 23:50:45 · 69 阅读 · 0 评论 -
day23【二叉树】669. 修剪二叉搜索树 | 108.将有序数组转换为二叉搜索树 | 538.把二叉搜索树转换为累加树 | 二叉树总结篇完结撒花
代码随想录 | 二叉树总结篇。原创 2023-06-14 12:48:24 · 29 阅读 · 0 评论 -
Day17 【二叉树】110.平衡二叉树 | 257.二叉树的所有路径 | 404.左叶子之和
如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。所以如果已经不是二叉平衡树了,可以返回-1 来标记已经不符合平衡树的规则了。明确递归逻辑:分别求左右子树的高度,如果差值小于等于1,则返回当前二叉树的高度,否则就返回-1,表明已经不是平衡二叉树了。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。思路:递归,但是要明确什么是左叶子,左叶子是左孩子不为空,但左孩子的左右孩子为null的节点。返回值:以当前传入节点为根节点的树的高度。原创 2023-06-01 13:11:06 · 29 阅读 · 0 评论 -
day36【贪心算法】● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间
题意:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。题意:给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。思路:按左边界排序后,把一个区间加入结果集中,不断把新的区间和结果集中的边界做对比。思路:和day35中的射气球的题很像,把重叠区间的个数求出来就可以了。原创 2023-07-12 13:32:59 · 51 阅读 · 0 评论 -
day24【回溯算法1】理论基础 | 77.组合
回溯搜索法是一种搜索的方式。回溯是递归的副产品,只要有递归就会有回溯。回溯函数也就是递归函数,指的都是一个函数。原创 2023-06-16 12:58:11 · 29 阅读 · 0 评论 -
day37 【贪心算法】● 738.单调递增的数字 ● 968.监控二叉树 ● 总结
738.单调递增的数字 | 题目链接代码随想录 | 讲解链接题意:当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。思路:例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。如果从前向后遍历,遇到strNum[i - 1]原创 2023-07-13 13:59:17 · 43 阅读 · 0 评论 -
day35 【贪心算法】● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被 引爆。可以射出的弓箭的数量 没有限制。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。原创 2023-07-11 16:50:54 · 97 阅读 · 0 评论 -
day30【回溯算法】332.重新安排行程 | 51.N皇后| 37.解数独 | 总结
代码随想录 | 回溯算法总结大全。原创 2023-07-04 12:24:08 · 73 阅读 · 0 评论 -
day34【贪心算法】● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果
i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,因为这个区间选择任何一个位置作为起点,到i这里都会断油,那么起始位置从i+1算起,再从0计算curSum。此时局部最优:取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果数量,保证第i个小孩的糖果数量既大于左边的也大于右边的。局部最优:当前累加rest[i]的和curSum一旦小于0,起始位置至少要是i+1,因为从i之前开始一定不行。题意:n 个孩子站成一排。原创 2023-07-10 17:48:20 · 72 阅读 · 0 评论 -
【day27】回溯算法 39.组合总和 | 40.组合总和Ⅱ | 131.分割回文串
题意:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。题意:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。题意:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。示例: 输入: “aab” 输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]说明: 所有数字(包括目标数)都是正整数。原创 2023-06-26 22:02:38 · 74 阅读 · 0 评论 -
day28【回溯算法】93.复原IP地址 | 78.子集 | 90.子集Ⅱ
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。用一个used数组记录元素是否已经取过,注意要区分同层和同树枝的区别,同层相同的不能取,同树枝相同的可以取。题意:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。题意:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。原创 2023-06-27 22:50:33 · 79 阅读 · 0 评论 -
day20 【二叉树】654.最大二叉树 | 617. 合并二叉树 | 700.二叉搜索树中的搜索 | 98.验证二叉搜索树
合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路:中序遍历二叉搜索树,是一个有序的且升序的数列。题意:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。题意:给定一个二叉树,判断其是否是一个有效的二叉搜索树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。右子树是通过数组中最大值右边部分构造出的最大二叉树。节点的右子树只包含大于当前节点的数。二叉树的根是数组中的最大元素。原创 2023-06-08 23:26:18 · 101 阅读 · 0 评论 -
day32【贪心算法】 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
思路:计算一段时间的利润比如第1天到第3天,可以用第1天利润+第2天利润+第三天利润计算。这样每天的利润是正的话,最后累加的利润只会越来越大。如果当天利润为负,只会拖累总利润和。计算每一天的利润,第0天买入,第1天卖出,此时就有第一天的利润了。如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。题意:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。局部最优:每次移动都去元素能跳跃的最大步数,即得到最大的覆盖范围。原创 2023-07-06 21:07:18 · 44 阅读 · 0 评论 -
day25【回溯算法】216.组合总和Ⅲ | 17.电话号码的字母组合
题意:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。原创 2023-06-19 21:53:05 · 36 阅读 · 0 评论 -
day31【贪心算法】理论基础 | 455.分发饼干 | 376.摆动序列 | 53.最大子序和
贪心的本质是选择每一阶段的局部最优,从而达到全局最优。两个例子:例1,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?指定每次拿最大的,最终结果就是拿走最大数额的钱。每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。例2:如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满?如果还每次选最大的盒子,就不行了。这时候就需要动态规划。动态规划的问题在下一个系列会详细讲解。原创 2023-07-06 12:53:59 · 150 阅读 · 0 评论 -
day16【二叉树】104.二叉树的最大深度 | 559.n叉树的最大深度 | 111.二叉树的最小深度 | 222.完全二叉树的节点个数
题意:最小深度是从根节点到最近的叶子节点的最短路径上的节点数量,叶子节点是左右孩子都为空的节点!给定一个 n 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。思路:和二叉树求最大深度是一样的。原创 2023-05-30 23:41:56 · 96 阅读 · 0 评论 -
day15【二叉树】 层序遍历 | 226.翻转二叉树 | 101.对称二叉树
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。题意:给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)题意:给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。思路:层序遍历,每一行遍历的时候多加几行指向的代码,让temp.next指向队列的头节点。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。原创 2023-05-29 21:42:16 · 41 阅读 · 0 评论 -
day18 【二叉树】513.找树左下角的值 |112.路径总和 | 113.路径总和Ⅱ | 106.从中序与后序遍历序列构造二叉树 |105.从前序与中序遍历序列构造二叉树
【代码】day18 【二叉树】513.找树左下角的值 |112.路径总和 | 113.路径总和Ⅱ | 106.从中序与后序遍历序列构造二叉树 |105.从前序与中序遍历序列构造二叉树。原创 2023-06-07 22:43:59 · 31 阅读 · 0 评论 -
day21 【二叉树】 530.二叉搜索树的最小绝对差 | 501.二叉搜索树中的众数 | 236. 二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。用一个count记录当前节点值出现的次数,maxcount记录出现的重复元素的最大次数,并实时更新。题意:给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。结点左子树中所含结点的值小于等于当前结点的值。结点右子树中所含结点的值大于等于当前结点的值。左子树和右子树都是二叉搜索树。原创 2023-06-12 21:32:48 · 82 阅读 · 0 评论 -
day59【单调栈】503.下一个更大元素Ⅱ 42.接雨水 84.柱状图中最大的矩形
题意:给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素。数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。思路:和每日温度是一样的,把数组遍历两遍就行。原创 2023-11-13 20:48:51 · 173 阅读 · 0 评论 -
day52【子序列】300.最长递归子序列 674.最长连续递增序列 718.最长重复子数组
当nums1[i-1] == nums2[j-1]时(因为dp数组的定义是表示以i-1和j-1为结尾的,所以这里比较的是i-1和j-1的值相等,这是符合dp数组含义的),dp[i][j]需要加1,dp[i][j] = dp[i-1][j-1]+1,在[i-1][j-1]的基础上做加1,需要同时回退,然后在此基础上做+1的操作。递归公式:下标i的最长升序子序列长度等于下标j从0到i-1各个位置的最长升序子序列+1的最大值,也就是下标i之前的,即到i-1的最长升序子序列长度+下标i本身(+1)的长度。原创 2023-11-01 12:49:25 · 173 阅读 · 0 评论 -
day42【动态规划】● 01背包问题 二维 ● 01背包问题 一维 ● 416. 分割等和子集
o2n。原创 2023-07-24 23:26:01 · 52 阅读 · 0 评论 -
day41 【动态规划】 ● 343. 整数拆分 ● 96.不同的二叉搜索树
题意:给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积。原创 2023-07-21 13:07:57 · 71 阅读 · 0 评论 -
day55【动态规划子序列】392.判断子序列 115.不同的子序列
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。如果有大量输入的 S,称作 S1, S2, …, Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。题意:给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10e9 + 7 取模。题意:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。思路 :看代码(自己还有点迷糊)原创 2023-11-05 21:56:47 · 104 阅读 · 0 评论 -
day49-51【动态规划】买卖股票的最佳时机问题
思路:动规五部曲,每天的状态分为两种,一个是当天持有股票的情况下手中的最大现金,一个是当天不持有股票的情况下手中的最大现金。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。题目描述:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。题目描述:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。贪心思路:计算每天最大利润值,这个方法更简单,但只针对比较特定的场景。原创 2023-10-27 13:13:22 · 86 阅读 · 0 评论 -
day43【动态规划】● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零
1049.最后一块手头的重量Ⅱ | 题目链接代码随想录 | 讲解链接题意:有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量。原创 2023-07-31 21:38:48 · 85 阅读 · 0 评论 -
day58【单调栈】单调栈知识 739.每日温度 496.下一个更大元素Ⅰ
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。原创 2023-11-12 14:56:08 · 201 阅读 · 0 评论