leetcode刷题笔记
文章平均质量分 53
我的代码不是我的代码
这个作者很懒,什么都没留下…
展开
-
leetcode 210拓扑排序
思路一:深度优先搜索1.首先我们将这些边集转化为图,题目的意思可以转化为,要访问一个节点,必须访问完其指向的其他节点才能够访问。2.这样,我们可以采取深度优先搜索的思想,假设现在访问节点cur,循环遍历访问它指向的其他未访问过的节点(nexti,nexti+1,nexti+2next_i ,next_{i+1} , next_{i+2}nexti,nexti+1,nexti+2),也就是依次进行dfs(nexti),dfs(nexti+1)......dfs(next_i),dfs(next_{i原创 2022-02-19 12:54:46 · 250 阅读 · 0 评论 -
leetcode 321
思路 :单调栈+自定义归并1.如果单纯地求一个数组nums[n]固定长度k的最大子数组subnums[k]的话,我们使用贪心+单调栈的思想即可解决。为了保证子数组最大,我们尽可能让大数靠前首先在保证单调栈的长度最终能够大于等于k,在此基础上保证单调栈的元素尽可能地递减扫描一遍数组,记当前遍历的元素位置为p,在保证最后单调栈的长度能够达到k的基础上,依次从栈顶弹出小于nums[p]的元素,然后再加入元素nums[p]。如果栈的元素大于k,需要将多余的元素从栈顶弹出。2.如果是两个数组nums1[原创 2022-01-23 12:39:00 · 186 阅读 · 0 评论 -
leetcode 44
思路:贪心1.假设p格式为”*p1*p2*p3*“,其中pi代表一个被分割的子串,我们只需要在s当中找到相应子串便可匹配成功了。比如说s=“abcdefgabc”,p=“bcdfgb*”,那么我们只需要按pi的相对顺序到s当中找到相应子串即可匹配成功。2.然而p也可能表示为”p0*p1*p2*p3*p4“,这样的话,我们得保证s当中必须以p0开头而且以p4结尾。3.为了保证以p4结尾,我们从后开始遍历s和p,令i=s.size()-1,j=p.size()-1,如果s[i]p[j]或者p[j]’?’,原创 2022-01-21 11:22:05 · 334 阅读 · 0 评论 -
leetcode 665
贪心算法+数组原创 2022-01-20 15:45:20 · 292 阅读 · 0 评论 -
leetcode 564
思路假设数字长度为length,我们将数字平均分成两部分prefix和last,第一部分prefix长度为(length+1)/2,last长度也是(length+1)/2要找最接近本数字的回文数字,我们需要在数字本身做最小的修改。我们分两种情况考虑本身是回文数:1.因为prefix是镜像对称的,我们在修改prefix的同时,last也随之而改变,比如说123321,我们修改prefix=124,那么last=421才能保证回文性。2.我们对prefix进行修改,因为结果要保证最接近n,那么我们需原创 2022-01-19 15:13:06 · 67 阅读 · 0 评论 -
leetcode 188
动态规划+状态压缩原创 2022-01-16 23:33:29 · 87 阅读 · 0 评论 -
leetcode 31
思路我们观察以下序列123456123465123546123564123654…可以看出这是个紧凑变化的排列,题目求解大意也是如此。如何根据已有序列求出下一个排列呢?观察可知,我们需要将排在前面较小的数nums[j]与排在后面较大的数字nums[k]交换,j<k,比如说123465,我们交换的是4和5,而这样子选择有什么要求呢?1.我们希望较大数字的位置k尽可能地靠右,然后较小数字的位置j尽可能靠近k,这样保证变化幅度变化是最小的。3.在交换完之后,因为需要改变k后面的序列,原创 2022-01-15 21:25:50 · 121 阅读 · 0 评论 -
leetcode 8
有限状态机原创 2021-12-28 20:00:06 · 163 阅读 · 0 评论 -
leetcode 11
思路:双指针1.任意设两个指针i和j(i<j),计算其所能够收集的水量temp=min(height[i],height[j])(j-i)。2.在i不能向左移动和j不能向右移动情况下,如何移动能够使得收集的水量更多呢?是先移动i还是j呢?3.我们尝试移动i和j任何一个指针,这样使得宽度减小,宽度减小的情况下,我们如何能够获得更大的水量呢?4.依据公式temp=min(height[i],height[j])(j-i),显然,我们需要保证min(height[i],height[j])的值在增大原创 2021-12-27 20:53:30 · 463 阅读 · 0 评论 -
leetcode 7
思路1.对于一个普通数字,要求其反转后的结果,需要借助中间变量tmp记录其反转的部分数字结果,也就是每遍历一个数字x[i],首先将tmp10,然后加上x[i]。2.如果需要考虑反转后的数字大小要在int表示的范围内,那么就需要将最后的结果与INT_MAX和INT_MIN作比较,但是由于tmp在计算过程中的可能就已经超出了INT_MAX或者INT_MIN,这样会导致溢出无法比较。3.所以我们在tmp即将要超过INT_MAX或者INT_MIN之前也就是(>=INT_MAX或者是<=INT_MI原创 2021-12-24 12:37:04 · 182 阅读 · 0 评论 -
leetcode_3
思路:滑动窗口1.遍历字符串,维护一个滑动窗口,每遍历一个字符,保存窗口当中每个字符出现的位置。2.如果新的字符没有在滑动窗口中出现,则直接加入滑动窗口,并保存其位置;否则将滑动窗口缩小,保证滑动窗口每个字符都只出现,也就意味着要清空某些字符的位置信息。代码:class Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char,int> w; int原创 2021-12-23 20:19:07 · 293 阅读 · 0 评论 -
leetcode 968
贪心算法+后序遍历原创 2021-12-05 13:05:34 · 479 阅读 · 0 评论 -
leetcode 714
贪心算法原创 2021-12-04 22:53:04 · 507 阅读 · 0 评论 -
leetcode 738
贪心算法原创 2021-12-02 21:58:44 · 89 阅读 · 0 评论 -
leetcode 491
思路一:1.首先我们确定一个结果集合res和一个临时路径集合temp。2.遍历数组的每个元素,对于每个元素,有取和不取两种选择,使得对应的temp不同,当我们遍历完最后一个元素时,需要将temp加入res当中。3.由于题目要求是递增序列,所以在取之前我们需要判断当前元素是否大于等于temp当中最后一个元素,如果不满足,则不取当前元素,然后继续递归遍历下一个元素。4.如果满足的话,我们将当前元素加入temp当中,然后递归遍历下一个元素。在递归回溯之后,我们还需要考虑当前元素不取的情况,所以我们需要将当原创 2021-11-29 19:03:36 · 333 阅读 · 0 评论 -
leetcode 332
深度优先搜索+贪心选择原创 2021-11-28 23:26:15 · 162 阅读 · 0 评论 -
leetcode 438
滑动数组+哈希数组原创 2021-10-08 23:51:19 · 106 阅读 · 0 评论 -
leetcode_程序员面试金典0207
链表+双指针原创 2021-10-07 23:18:40 · 153 阅读 · 1 评论 -
leetcode 19
链表+滑动窗口原创 2021-10-07 23:17:40 · 124 阅读 · 0 评论 -
leetcode_142
思路:快慢指针1.首先确定是否存在环,为了在O(1)时间内确定是否存在环,我们采取快慢指针的方式。2.初始状态设置快指针fast=head,慢指针slow=head,然后快慢指针遍历整个链表,快指针每次比慢指针走快一步,这样每次多一步积累下去,如果存在环,那么快慢指针肯定会在环之内相遇,也就是slow==fast;如果不存在环,那么快指针肯定会提前走到链表尾部。3.当确定已经存在环时,快慢指针停在环的某个位置,此时我们需要借组该位置确定环的初始位置,这时我们可以思考,是否可以使用快慢指针,在特殊起点开原创 2021-10-07 22:31:00 · 59 阅读 · 0 评论 -
leetcode_763
思路:贪心算法1.逆序扫描一遍数组,找到每个元素最后出现的位置,记录在last[26]当中2.正序扫描数组,用start记录当前元素段的起始位置,用end记录当前段中元素出现位置最后的那一个元素最后出现的位置。3.判断当前位置是否等于end,如果不是,则更新end,把当前元素加入当前元素段;如果此时位置为end,则将当前元素段长度加入结果数组中,重新开始新的元素段。4.正确性:根据题目要求,每个元素段中的元素只能在当前元素段出现,也就意味着其最晚出现的位置应该在当前元素段之中,根据算法,如果当前位置原创 2021-10-01 11:15:02 · 64 阅读 · 0 评论 -
leetcode_560
思路:1.记前缀和pre[i]为第i个元素之前所有元素的总和,从左到右遍历数组2.从左到右遍历数组的过程中,如果pre[i]-pre[j]==k,且0<=j<i,这样则找到了一个总和为k的子数组,因为对于一个i可能同时有多个j使得等式成立,所以我们在遍历到第i个元素时需要知道有多少个j满足pre[j]==pre[i]-k。3.因为pre[j]的求解是通过前面元素的遍历得来的,因此我们在求解每个pre[i]之后可以将其存入hash表,其中键为pre[i]的值,如果hash表map中已经存在了原创 2021-09-29 22:08:34 · 123 阅读 · 0 评论 -
leetcode 334
双指针+简单证明原创 2021-09-29 17:06:39 · 266 阅读 · 0 评论 -
leetcode 240
二分搜索思想\矩阵分区原创 2021-09-28 23:24:21 · 133 阅读 · 0 评论 -
leetcode 75
数组+双指针原创 2021-09-18 23:55:17 · 83 阅读 · 0 评论 -
leetcode 145
二叉树后序遍历原创 2021-09-10 09:30:24 · 161 阅读 · 0 评论 -
leetcode 144
二叉树前序遍历三种方式1.线索二叉树2.迭代3.递归原创 2021-09-03 22:53:26 · 149 阅读 · 0 评论 -
leetcode 4
有序数组+中位数二分法+中位数原创 2021-08-31 15:21:29 · 155 阅读 · 0 评论 -
leetcode 21
经典合并链表分治解法原创 2021-08-30 19:41:42 · 51 阅读 · 0 评论 -
leetcode 141
链表+双指针妙用原创 2021-08-29 20:48:57 · 91 阅读 · 0 评论 -
leetcode 73
数组+状态压缩原创 2021-08-28 21:21:54 · 98 阅读 · 0 评论 -
leetcode 53
数组问题+分治递归解决原创 2021-08-24 16:32:06 · 190 阅读 · 0 评论 -
leetcode 518 and 377
母函数+DP原创 2021-08-22 21:24:33 · 104 阅读 · 0 评论 -
leetcode 221
矩阵+DP原创 2021-08-22 16:30:29 · 66 阅读 · 0 评论 -
leetcode 72
编辑距离dp解决原创 2021-08-22 11:51:09 · 67 阅读 · 0 评论 -
leetcode 1314
前缀和+dp原创 2021-08-16 14:58:21 · 125 阅读 · 0 评论 -
leetcode 96
思路1.首先分析二叉搜索数的特征,父亲节点左子孙的值均小于等于父亲节点,父亲节点右子孙的值均大于等于父亲节点,对于每一颗子树只需要确定父亲节点的值,子孙节点的分布大致也可确定。2.首先我们确定根节点的值,假设为i,i=1…n,则左边子树的数范围即可确定为1…i-1,右边子树的数范围确定为i+1…n,假设左边子树的形态有left种,右边子树形态有right种,那么以i为根节点的树有left*right种形态,且left和right只是与数的个数有关而与其具体数值无关,因此可以统一left和right,记G原创 2021-08-15 16:12:08 · 159 阅读 · 0 评论 -
leetcode 264
小顶堆dp指针+dp原创 2021-08-14 16:33:35 · 64 阅读 · 0 评论 -
leetcode 42 接雨水
动态规划单调栈双指针原创 2021-08-12 23:19:00 · 108 阅读 · 0 评论 -
leetcode 309
最佳买卖股票时机含冷冻期原创 2021-08-08 22:06:38 · 136 阅读 · 0 评论