
力扣
文章平均质量分 90
一只小透明啊啊啊啊
这个作者很懒,什么都没留下…
展开
-
递归类问题(待补充)
5. 注意该问题因为是栈中元素有序,所以可以递归解决6. 该问题数据结构是栈,顺序存储的元素,与单链表不同,单链表递归可能会考虑它的上一个结点。不过递归尽头都是单一的一个元素如何解决。7. 关于问题规模:数组直接传递参数n, 单链表传递的是linklist->next,(所以不需要n,自己本身的数据结构直接减一了)PS:做题记录//14.13-14.35思考递归未果//14.35-14.43用其他方法解除//14.43-14.39思考递归未果,看答案。原创 2024-11-21 14:34:43 · 692 阅读 · 0 评论 -
【代码随想录】哈希
当我们需要枚举数组中的两个元素时,如果我们发现随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法,将枚举的时间复杂度从 O(N^2)减少至 O(N),如本题和为固定值0,a,和值不变,b增大,c减小。对两个数组排序的时间复杂度分别是 O(m log m)和 O(nlog n),双指针寻找交集元素的时间复杂度是 O(m+n),因此总时间复杂度是O(mlogm+nlogn)。不能用双指针,首先,要返回的是原来的坐标,如果先排序再用两数之和,那么返回的left和right就是排序后的坐标。原创 2024-11-21 14:32:37 · 992 阅读 · 0 评论 -
【代码随想录】字符串 (KMP,BF ,扩充数组,for循环固定规律一段处理,整体反转+局部反转,双指针,滑动窗口,库函数)
使用了一个标志来看是否进入了单词区,我使用的是pos标记第一个单词字符位置,用i标志单词的最后一个字符,没有使用标志进入单词区。精妙之处在于双指针的终止条件是i==j相等,因为扩充的是空格的个数,所以相当于i在追j,当追上之后说明空格已经被填满了,前面没有空格了,可以停止,而不是i>=0作为i停止条件。随想录使用的是&,因为最后用了resize()重新定义了大小,所以可以用引用!本题目是将一个字符换成三个字符,使用char类型的数组,该数组长度为原来数组的三倍(最大全替换),最后再返回为真实长度的数组。原创 2024-11-21 14:32:15 · 1007 阅读 · 0 评论 -
【代码随想录】链表: 递归,虚拟头结点,双指针,栈,哈希
递归深入是压栈的过程,直到链表的最后一个节点的next,然后开始返回,返回到最后一个节点本身,再判断,当前节点(最后一个节点)的值是否等于val,如果等则返回他的next,那么到一上层倒数第二个节点,它的next值就是倒数第一个节点的next;所以是从后往前删除的,因为是删除,所以你要知道它的上一个节点,递归的调用赋值给head->next,即head->next= removeELements(X,X), 而递归参数应该是head->next, 因为要保证该节点的后面所有节点都是没有val的。原创 2024-11-21 14:14:37 · 665 阅读 · 0 评论 -
【代码随想录】栈,队列(双端队列,单调队列,单调栈,优先级队列)
stack 和queue 是容器适配器,底层容器可为deque,list,vector来实现,默认是deque双端队列,提供O(1)的push_back(),而vector提供均摊的O(1)原创 2024-11-21 14:13:20 · 861 阅读 · 0 评论 -
【代码随想录】树的遍历题目
针对二叉树的问题,解题之前一定要想清楚究竟是前中后序遍历,还是层序遍历。二叉树解题的大忌就是自己稀里糊涂的过了(因为这道题相对简单),但是也不知道自己是怎么遍历的。原创 2024-11-21 14:12:09 · 1004 阅读 · 0 评论 -
【代码随想录】树的构建题目
106. 从中序与后序遍历序列构造二叉树题目题目思路:【随想录】搞清楚人做的时候的逻辑:在后序数组中找到最后一个当作根节点利用这个根节点到中序数组中找到该点,作为分割点,将中序数组分割成左右两个利用中序数组的左右数组,再到后续中继续进行分割难点:每次递归的左右区间边界点要弄清楚,即循环不变量,这里用的左闭右开区间。**以下是看了思路后写的,不太对!少了很多东西主要问题是划分边界值,以及少了对特殊节点的判断(空树),大逻辑正确,代码里的注释是错误点反思。class Solution原创 2024-11-21 14:11:45 · 617 阅读 · 0 评论 -
【代码随想录】回溯
剪枝操作是根据k和n的值来做的,比如k=4,n=4,那么for循环时,只会有一个解即:1 2 3 4,即从1开始的for循环有结果,而从2开始之后的for循环都没用,不可能是解,因为后面取得数个数一定比4小,所以这种情况就可以剪枝,在for循环得startindex上做文章(结合随想录的树形图,注意一个矩形就是一个for循环!回溯的解决方法都可以抽象成为树形结构,回溯法解决的问题都是在集合中找子集的问题,集合的大小就是树的宽度,递归的深度就是树的深度,递归必然有终止条件,因此一定是一个深度有限的N叉树。原创 2024-11-21 14:11:12 · 944 阅读 · 0 评论 -
【代码随想录】滑动窗口
看的官方题解评论区,发现,每次left可以直接从下一个相同字符的下一个开始,使用map<char,int> int 记录每个字符的位置,出现相同字符则记录的是该字符出现的上一个位置,如abcdefdgh, 当遇到第二个d时left会跳到e, 因为在a-第一个d之间的连续字串的长度都比a-d小,所以这是不必要的循环,直接跳到第一个d的下一个。4. 哈希表如何构造?请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。原创 2024-11-21 14:10:44 · 804 阅读 · 0 评论 -
【代码随想录】动态规划
2.dp表达式,不用管之前的是否有障碍物即dp[i-1][j],dp[i][j-1], 只需要保证当前计算的dp[i][j]是没有障碍物的。dp[i][j]=dp[i-1][j]+dp[i][j-1]. dp[i][j]可以表示为dp[i-1][j]向下移动一格,或者是dp[i][j-1]向右移动一格。dp[i-j](这里dp[i-j]表示分解数字i-j,得到的最大乘积为dp[i-j]也就是基于之前得到的结果进行的)初始化:dp[0][0]=0 dp[0][1]=1;dp[1][0]=1;原创 2024-11-21 14:09:53 · 1011 阅读 · 0 评论 -
【代码随想录】贪心
如果当前股票price[i]>buy,说明可以卖出并获得price[i]-buy的收益,但是该结果不一定是最优的,因为后面可能会出现比price[i]还高的价格,所以可以看成是当前我用price[i]买了一只股票,即将buy更新为price[i]-free,后面如果出现了新的高的价格即price[i+1]>price[i]时,就会累加收益price[i+1]-buy (buy=price[i]),相当于是price[i+1]-price[i]k>负数个数时,且数组中有0时,就将多余的k弄到0身上;原创 2024-11-21 14:09:08 · 1114 阅读 · 0 评论 -
树遍历(先序,中序,后序,层序)
一、树的遍历两种框架:一、深度优先遍历:1.前序遍历2.中序遍历3.后序遍历二、广度优先遍历层序遍历(迭代,队列实现)三种方法:递归,迭代,Morris 遍历栈可以实现递归递归法:中序遍历/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(原创 2022-06-28 15:35:07 · 1443 阅读 · 0 评论 -
随想录【贪心】
即将一个区间prices[5]-prices[4]分解成(prices[2]-prices[1])+(prices[3]-prices[2])+(prices[4]-prices[3])+(prices[5]-prices[4]),就变成了相邻天数的利润相加。我的思路:只想到了按照左边进行排序,但是不知道怎么选择引爆的位置,以及与下一个气球之间如何有联系,随想录的思路是,将区间左边从小到大排列后,引爆的位置选择重叠气球的右边最小的位置A,这样下一个气球直接看开始位置是否大于A。比如nums[i]=3,原创 2024-11-21 14:04:09 · 651 阅读 · 0 评论 -
leetcode100滑动窗口
难点是不是对照一样的,而是异位的,所以不能同时进行遍历两个串,这样是比较是否一样。想到的解决思路是26格字母的一个数组进行计数,或者说使用字典,dictionary,然后看是否一致?起码每次滑动的长度是字串的长度,然后就检查一下计数的数组?官方用的双重循环我没搞明白,疑惑点是right++为什么不能写到if外面,是不行的比如:abcb,当right在b的时候,需要将left往右边移动,直到b才能移除重复的元素。我的思路:在一个串中找到另一个字串,字串的位置是错位的。滑动窗口怎么判断有没有重复,使用的哈希。原创 2024-11-20 15:54:51 · 208 阅读 · 0 评论 -
leetcode100双指针
每次找到后一个比自己高的柱子,求出体积减去中间部分的柱子体积,错误的原因,没有考虑周到,只是看着图形想的,但是有可能第一个高,右边遍历就得找比它低的,而我只找到比它高的。正确的思想应该找到一个。另一个思路是不必要每次都交换相邻的,而是当i为0时,用j找到第一个不为0的与i进行交换,然后i继续往后,j也继续往后,有点像简单选择排序算法?思路一样,但是写的精简了,我是先找到第一个i为0的,意思就是不是0,i和j一直同时加,如果是0,那么j一直加。,判断每一个第i个柱子接的雨水,而不是根据图形的个例来设计算法。原创 2024-11-20 15:53:04 · 243 阅读 · 0 评论 -
Leetcode100子串
这意味着如果你想知道从元素 i+1 到 j 的子数组的和,你可以用 pre[j] - pre[i] 来计算。存储<前缀和’‘i-k’‘,前缀和’‘i-k’'出现的次数>,即看是否有pre[j]存在,存在的话说明存在[j…i]的和为公式:pre[i]-pre[j-1]==k,即pre[j-1]=pre[i]-k;这个题目和上面的题目有点类似,都是三重循环,一层是总的遍历数量,一层left,一层right遍历left到right之间的(k长度)双指针i,j也可以是双端队列,左边i,右边j。原创 2024-11-20 15:49:15 · 747 阅读 · 0 评论