![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
EricJeffrey
这个作者很懒,什么都没留下…
展开
-
LeetCode 239 Sliding Window Maximum
LeetCode 239 Sliding Window Maximum思路相当有趣的一道题,除了暴力外有三种解法有序集合使用multiset,初始化前k个数,然后每次查找-删除-添加-取最大值即可。C++里set multiset是有序的,虽然不支持随机访问,但是指定greater模板参数后就可以直接使用*set.begin()获得最大值了。双端队列维护一个双端队列,该队列总是保持如下特性队列中任一位置前的元素总比该位置的大队列最前端元素是最大值队列最大为k上述特性能够保证在O(1)原创 2021-01-12 15:56:52 · 183 阅读 · 0 评论 -
LeetCode 295 Find Median from Data Stream
思路使用multiset+pointer,在向multiset插入数据同时更新pointer,确保pointer总是指向中位数或者第一个中位数如果数据个数是偶数个。set,multiset,map的迭代器在插入操作后仍然有效。代码class MedianFinder { multiset<int> data; multiset<int>::iterator mid;public: MedianFinder() {} void addNum(i原创 2021-01-07 10:20:57 · 170 阅读 · 0 评论 -
LeetCode 42 Trapping Rain Water
思路很直观的解法是不断找凹形区域然后计算,这个思路可以延伸为阶段式的,使用最大高度的柱子将数组划分为三个部分,左边从左到右、右边的从右到左不断找比当前元素大的然后计算所覆盖区域的值,最大柱子之间的直接计算,这样子需要两三次遍历,但可以更高效。考虑上面所说的从左到右寻找比当前元素大的计算,这样的区域其能容纳的水量一定是其中左边的柱子高度减去中间每个柱子的值,同样从右到左的过程也是,因此即便未遇到比当前元素大的数,只要能够保证比当前元素大的数存在,就可以直接使用从左到右左侧值 - 当前考察柱子高度或者从右到原创 2021-01-04 11:29:16 · 101 阅读 · 0 评论 -
LeetCode 312 Burst Ballons
思路首先是brute-force暴力,直接dfs,复杂度O(n!)直接爆炸。然后暴力+记忆化,取一个元素后断开的数组会连起来,状态过于复杂,即便可以记忆化复杂度也很大。既然取的过程没法分解问题,那反过来思考,不断的取出等价于一个空数组不断地放回,放回的过程中,一旦某些元素确定位置,就会把整个数组划分成多个部分,因此也就可以对每个部分单独考虑,这样就把整个问题分成了几个子问题,这是分治和动态规划的前提。继续考虑容易想到,假设已经确定第一个放回的是第k个元素,那最终解即是 1 * nums[k] * 1原创 2021-01-03 11:10:01 · 96 阅读 · 0 评论 -
LeetCode 1263 Minimum Moves to Move a Box to Their Target Location
思路推箱子,数据范围比较小,可以bfs套bfs暴力搜索,不过在外层bfs的时候,是否访问过要同时考虑 箱子位置 和 人的位置。代码typedef vector<vector<char>> VCC;struct Pos { int row, col; bool operator==(const Pos &t) { return row == t.row && col == t.col; }};vector&l原创 2020-12-17 15:56:52 · 131 阅读 · 1 评论 -
LeetCode 659 Split Array into Consecutive Subsequences
LeetCode 659 Split Array into Consecutive Subsequences思路两遍循环第一遍统计每个字的出现次数第二遍判断当前字符是否可作为某个串的结尾,或一个新串的开头比如[1, 2, 3, 3, 4, 5, 6],第二遍循环时,首先判断1可以作为开头,那么对2和第一个3的访问就可以忽略了,之后对第二个3可以作为一个开头,同样忽略4和5,对最后一个6,他可以作为以5结尾的串的后继,将其作为新结尾即可。需要记录数字的可用个数,以及以上一个紧邻数字结尾的串可用原创 2020-12-15 15:33:16 · 104 阅读 · 0 评论 -
LeetCode 1202 Smallest String With Swaps
思路首先要能想到并且发现,对于任何相连的,或者说在一棵树上pairs,比如[[0, 1], [0, 2], [1, 3], [1, 5], [2, 4], [2, 6]],他们可以通过交换产生任意顺序的排列。证明的方法可以通过表示成树的形式然后分析。简单来说,对于任何两个一棵树上的pair[u, v],都可以通过先将u交换到v,再反过来将v换到原来u的位置实现互换。例如[[0, 1], [0, 3]],1和3互换可以通过swap(0, 1), swap(1, 3), swap(3, 0)来实现。有了上述原创 2020-12-08 17:23:04 · 105 阅读 · 0 评论 -
LeetCode 413 Arithmetic Slices
思路比较奇怪的题目,实际就是给N个数,求里面的所有长度至少为3的等差数列的个数。例如数组[1, 2, 3, 4, 5]的结果为6,分别是[1,2,3] [2,3,4] [3,4,5] [1,2,3,4] [2,3,4,5] [1,2,3,4,5]。对于长度为N的等差数列,其包含的长度不小于3的等差数列个数是: (N-3+1 + N-4+1 + ... + 2 + 1) = 1 + 2 + ... + N - 2 = (N-1)(N-2)/2,所以双指针找数组中最长的等差数列然后根据长度计算结果即可。(原创 2020-12-07 19:06:58 · 101 阅读 · 0 评论 -
LeetCode 1388 Pizza With 3n Slices
思路就像提示里说的,该问题实际上可以描述为,给N个数,从里面选择N/3个数使其和最大,选出的数不能相邻,且不能同时选第一个和最后一个。如果没有最后一个限制条件的话,其实就是个背包问题,定义dp[i][j] = [0~i]选j个数的最大和,然后能够得到dp[i][j] = max(dp[i - 1][j], dp[i - 2][j - 1] + slices[i]),也就是计算dp[i][j]的时候需要考虑是否选slices[i]的问题。然后对于第一个和最后一个不能同时选的问题,可以这么思考:因为不能同原创 2020-12-07 17:24:02 · 147 阅读 · 0 评论 -
LeetCode 567 Permutation in String
解法统计s1中字符出现次数countOfLetters,使用双指针,维护s2中双指针之间的字符的出现次数tmpCountOfLetters以及s1中未被访问到的字符数countLeft。对于双指针i,j,后者用来考察在s1中出现的字符,前者用来将不满足的字符剔除考察范围。j指针前移过程:若 s2[j] 在 s1 中出现过,且当前出现次数小于s1中出现次数 将 j 处字符的当前出现次数加一 tmpCntOfLetters[s2[j]]++ 未被访问字符数减一 cntLeft--原创 2020-12-06 11:15:48 · 93 阅读 · 0 评论 -
LeetCode 1277 Count of Smaller Numbers After Self
暴搜设从(r, c)向右向下组成的矩阵的值为A(r, c),则有:A(r,c)=A(r+1,c)+A(r,c+1)−A(r+1,c+1)+T(r,c)A(r, c) = A(r + 1, c) + A(r, c + 1) - A(r + 1, c + 1) + T(r, c)A(r,c)=A(r+1,c)+A(r,c+1)−A(r+1,c+1)+T(r,c)其中,T(r, c)表示从(r, c)开始,包含(r, c)的方阵个数若 matrix[r][c] == 1 则 T = 1 + min原创 2020-12-05 14:49:49 · 107 阅读 · 0 评论