- 博客(75)
- 收藏
- 关注
原创 84. 柱状图中最大的矩形
这里注意开两个数组存一下每个高度的柱子左边第一个小于自己的下标,和右边第一个小于自己的下标。感觉像单调栈,但是就是想不出怎么用这个单调栈。
2024-09-03 16:39:39
240
原创 394. 字符串解码
是我忘记之前dfs的递归怎么写的了,回溯那一块全是用的递归,用递归需要很注意传入当前处理字符的位置这个参数!引用通常用于函数参数传递(传引用),或者返回值的传递,保证函数内部对参数的修改会影响到实参。指针常用于动态内存分配、数据结构(如链表、树)的实现,以及需要在运行时灵活操作内存的场合。指针是一个变量,它存储了另一个变量的内存地址。引用是某个变量的别名,一旦引用被初始化后,不能再改变引用到其他变量。栈:栈的方法主要注意细节,现在不是很理解递归怎么做的,先写一下递归的吧。使用场景也是面试问到了我的。
2024-09-01 14:21:33
468
原创 最小栈
单纯用一个变量记录最小值是无法实现常数时间内获取最小元素的,这个时候我们根据栈的特性,另开一个辅助栈,存储我们的栈里每个时刻的最小值。这题难就难在要能在常数时间内检索到最小元素。
2024-08-31 18:07:38
287
原创 划分字母区间
我觉得这道题最关键的一个思路就是,对于没一个字母,你一定要找到他的最后一次出现的位置,每一个片段必须要比这个大,然后该字符到这个end中其他的字符,也都要找到最后一次出现的位置,这个片段一定也要比这个大,然后我们遍历到这个片段里最大的最后一次出现的位置时候,就可以记录片段长度了,这个长度是符合题目意思的。第一个思路:记录每个字符的第一次出现位置和最后一次出现位置,之后这题就和。第二个思路:记录每个字母的结束位置。
2024-08-30 21:51:20
317
原创 跳跃游戏 II
相当于暴力了,还是过了,因为稍微剪了一点枝。dp[i]:表示到达i所需的最短次数。觉得代码不咋好理解,好难啊。想到用队列,一层一层往外扩。
2024-08-30 20:50:00
381
原创 121. 买卖股票的最佳时机
这题的关键点,是要想到用一个变量存一下股票的最低价格。买的那天一定是卖的那天之前的最小值。每到一天,维护那天之前的最小值即可。
2024-08-29 22:19:23
188
原创 72. 编辑距离
我记得之前做过的思路是:每次处理的时候只需要关注两个字符串的当前最后一个字母,因为此时默认前面的是匹配配对好了的。:用一个数来表示前面一堆东西的某个值,是对暴搜的优化!思路:这题也是acw上做过的,先想想吧。
2024-08-29 21:25:51
256
原创 647. 回文子串
dp[i][j]:代表i到j的这个子串是不是回文串,如果a[i]!3.i-j>1时,我们这个时候要判断dp[i+1][j-1] 是不是true,如果是true,则结果也是true.然后就是遍历顺序需要好好思考一下,我们算dp[i][j]的时候需要计算过后的dp[i+1][j-1]值,故我们需要从后往前遍历。三个元素就可以由一个元素左右添加元素得到,四个元素则可以由两个元素左右添加元素得到。2.i-j=1,就是相邻情况,也是true。1.i=j,返回true。
2024-08-22 23:51:31
268
原创 括号生成
就是在生成括号串的时候实时记录左括号和右括号数量,来实时保证生成括号的合法性。因为 n是生成的括号队数,那么n确定了,左括号和右括号的数量都确定了,都是n。然后只需要先加左括号,每一个左括号后面都必须要加一个右括号。2.怎么判断是否合法:从左到右遍历,记录左括号数-右括号数的值,若过程中出现了小于0或者结束的时候该值不等于0,则不合法,否则合法。怎么生成括号:递归处理。3.合法就可以存入答案。
2024-08-19 20:18:37
238
原创 39. 组合总和
递归参数:注意会多一个组合问题独有的参数,currentstep:当前从哪个位置开始for循环。这题是通过和的大小来限制。之前的题都是通过每层只能选一个来限制深度。终止条件:sum==target or sum>target。剪枝通常在for循环里来做文章。改动的地方为for循环 以及sort排序。
2024-08-18 17:51:49
262
原创 78. 子集
可以发现 0/1 序列对应的二进制数正好从 0 到 2^n−1。我们可以枚举 mask∈[0,2^n−1],mask 的二进制表示是一个 0/1 序列,我们可以按照这个 0/1 序列在原集合当中取数。当我们枚举完所有 2 ^n个 mask,我们也就能构造出所有的子集。我只能说位运算的代码,一看一个妙哉。
2024-08-17 04:08:28
299
原创 搜索旋转排序数组
看了下全网的思路,一个个来o,多做点题就知道了二分不仅仅只能用在有序的数组中。怎么判断要搜索的值在哪边呢,还是通过与nums[0]做对比就可以了。这道题很关键的一个值就是nums[0]。
2024-08-15 19:29:13
351
原创 在排序数组中查找元素的第一个和最后一个位置
注意要处理一下空数组的情况,对于vector这里的逻辑还是值得思考一下的,调试了挺久。由于数组按照升序排列,元素出现的第一个位置,可以用该元素右边的值全都>=该值这个性质。就是acwing上做的一道二分的模板题--数的范围。元素的最后一个位置,可以用该元素左边的值都<=该值这个性质。找一下分别满足什么性质就可以了。
2024-08-15 12:36:40
155
原创 搜索二维矩阵
然后就是找合适的行的时候,也可以用二分 时间复杂度就会从O(n)变为O(logn)直接用搜索二维矩阵Ⅱ的代码可以直接过掉。然后就是可以进行数组拼接再二分。
2024-08-15 02:46:28
260
原创 腐烂的橘子
思路:直接把最开始所有的腐烂的位置加入队列,然后bfs的时候每次取出的是腐烂的所有当前层橘子,读完题目感觉也就是个bfs的题。好吧 今天咳嗽咳到睡不着 直接起来做题了。思路感觉一直都很清晰,就是代码挺复杂的还。感觉自己写这一块已经有点那个意思了,嘻嘻。
2024-08-14 06:18:06
273
原创 岛屿数量
心情是真的非常激动,第一次全程手撸没看题解。待会看题解看看有啥优化的方法,自己再思考一下深搜的做法。之前ACwing刷过 那个题是全球变暖 比这个难 直接bfs上代码。1. 没有memset初始化st数组。3.dxdy直接赋值 有点不熟悉。2.忘记考虑边界问题。
2024-08-13 15:13:01
253
原创 二叉树的层序遍历
这种层序遍历直接bfs。这里可以选择每次从队列中取一层,但是没必要,直接常规队列bfs就可以了。// 为当前层创建一个新向量这一行代码,解决了问题。如果不加这一行代码,后续的ans[cs]就是未定义的调用,肯定会报错的。好吧还是有必要的,答案输出的时候要求一层层的分开输出。这一条是精华所在,好好领悟!
2024-08-12 18:29:01
177
原创 二叉树的直径
可以回去看看递归求深度的dfs函数怎么写的,根据这个只需要加一个全局变量维护一下每个结点的左子树深度+右子树深度+1就可以了。这题其实就是要想到一个转化的问题:题目要求的直径其实就是每个结点的左子树深度+右子树深度+1里的最大值。
2024-08-12 01:23:11
211
原创 对称二叉树
用一个队列,每次同时放两个根节点入队,每次检查队列里相邻俩个结点的值相不相等,不相等就直接返回false, 随后,将这两个结点的左右孩子对应的入队就可以了。(ps:明天开始更新 408笔试面试复习)(那个clip项目得花时间弄简历上,把那个软件的换掉)关键词:diffusion 和clip。最后队列为空或者出现false就停。
2024-08-11 23:56:54
248
原创 二叉树的最大深度
怎么控制一层层地拓展呢,加一个sz 维护每次开始拓展一行的时候,队列里的元素个数,这就是这一行的元素个数。用while(sz--)可以一行行拓展。好久没写深搜了 回忆下怎么写。取队头:q.front();取栈顶:st.top();看代码也可以领悟这一点。
2024-08-10 23:18:56
307
原创 二叉树的中序遍历
首先对于每个结点 就先放入栈中,然后看它有没有左孩子,有左孩子就将左孩子继续放入栈中,没有左孩子就把当前结点输出,再看它有没有右孩子,有的话就放入栈中,继续上述操作,每次都处理当前结点。递归函数我们也可以用迭代的方式实现,两种方式是等价的,区别在于递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,其他都相同,具体实现可以看下面的代码。注意:栈和队列是push,vector是push_back。这个迭代的代码需要好好理解,为什么这么写,好好思考琢磨。代码其实之前有写过类似的。
2024-08-10 02:09:13
342
原创 搜索二维矩阵 II
思路:我们可以发现,每个任意大小的矩形,都是右下角的元素最大,左上角的元素最小,这就是一个区间。把每个要搜的元素跟对角线元素先比较,然后在两个对角线顶点间的矩形中去寻找。这样是区分不开的,也很难找,因为你右下角往左往上移动,martix都变小,没有区分度,何谈寻找?左上角同理:往右往下移动,martix值都变大,没有区分度,谈何寻找?可以看到最坏情况是 要查找的元素在整个矩阵的左下角,这个时候所花时间为(m+n)。对于左下角元素:往上变小,往右变大,是有区分度的?对于右上角元素:往左比他小,往下比他大。
2024-08-09 23:16:43
399
原创 旋转图像
思路:第一意识是找一个数学规律,一个公式可以找到对应的位置。唉 想不出 没啥思路 看题解了。一看就懂了 规律就是。。。。。。:原来第行第列的元素 在旋转后 会在第行倒数第列。这种题目做少了,多做几个矩阵的总结一下规律就懂了。
2024-08-09 20:49:37
832
原创 缺失的第一个正数
首先,由于缺失的正整数一定在[1,N+1]中:若[1,N]都存在,则缺失的为N+1,否则,缺失的正整数就在[1,N]中。然后遍历一次数组,将遍历到的值在[1,N]中的对应位置加上负号(打上标记),代表这个位置所代表的正整数是在数组中存在的。但是用了排序,算是作弊了吧,排序是nlogn 题目要求时间复杂度On,且常数级别的空间复杂度。最后,再遍历一遍数组,若所有的位置都被打上了标记(全部为负数),则第一个缺失的正整数即为N+1。由于会出现负数,(被标记过了),故在进行遍历的时候,取绝对值来判断。
2024-08-06 22:26:42
484
原创 除自身以外数组的乘积
这样对于每一个元素的值,只需要求前缀乘积*后缀乘积就可以了。避免了很多重复运算。相当于先预处理好了。考虑联想前缀和和后缀和,我们能不能构建一下前缀乘积和后缀乘积数组,来避免重复运算?题目说不能用除法,且要在O(n)的时间内完成。
2024-07-23 22:33:24
182
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅