
算法
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 · 237 阅读 · 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 · 221 阅读 · 0 评论 -
LeetCode 42 Trapping Rain Water
思路很直观的解法是不断找凹形区域然后计算,这个思路可以延伸为阶段式的,使用最大高度的柱子将数组划分为三个部分,左边从左到右、右边的从右到左不断找比当前元素大的然后计算所覆盖区域的值,最大柱子之间的直接计算,这样子需要两三次遍历,但可以更高效。考虑上面所说的从左到右寻找比当前元素大的计算,这样的区域其能容纳的水量一定是其中左边的柱子高度减去中间每个柱子的值,同样从右到左的过程也是,因此即便未遇到比当前元素大的数,只要能够保证比当前元素大的数存在,就可以直接使用从左到右左侧值 - 当前考察柱子高度或者从右到原创 2021-01-04 11:29:16 · 143 阅读 · 0 评论 -
LeetCode 312 Burst Ballons
思路首先是brute-force暴力,直接dfs,复杂度O(n!)直接爆炸。然后暴力+记忆化,取一个元素后断开的数组会连起来,状态过于复杂,即便可以记忆化复杂度也很大。既然取的过程没法分解问题,那反过来思考,不断的取出等价于一个空数组不断地放回,放回的过程中,一旦某些元素确定位置,就会把整个数组划分成多个部分,因此也就可以对每个部分单独考虑,这样就把整个问题分成了几个子问题,这是分治和动态规划的前提。继续考虑容易想到,假设已经确定第一个放回的是第k个元素,那最终解即是 1 * nums[k] * 1原创 2021-01-03 11:10:01 · 130 阅读 · 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 · 182 阅读 · 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 · 152 阅读 · 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 · 137 阅读 · 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 · 134 阅读 · 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 · 209 阅读 · 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 · 126 阅读 · 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 · 167 阅读 · 0 评论 -
LeetCode Maximum Width of Binary Tree
文章目录题目大意思路代码总结题目大意计算一个二叉树每一层宽度的最大值。宽带并不是几个元素,而是最右边元素的位置-最左边元素位置+1.例如下面这个二叉树的最大宽度为3. 1 / \ 3 2 \ \ 3 9 / 6 思路只要标记一下每个节点的位置左孩子:pos*2, 右孩子:pos*2+1),同时记录每一层开始和结束的原创 2020-07-12 15:01:21 · 121 阅读 · 0 评论 -
LeetCode Daily Challenge Sort Colors
文章目录题目大意思路代码总结题目大意对一个数组就地in-place排序,即直接在原数组基础上进行。数组只包含0, 1, 2三个元素。例如:Input: [2,0,2,1,1,0]Output: [0,0,1,1,2,2]进阶: 容易想到统计次数+重填的两次遍历的方法,请你给出个一次遍历+常数空间。思路因为只包含三个元素,因此可以采用不断交换的方式。遇到0,就先和前面的2交换,再和1交换,遇到1就和前面的2交换。这样只需记录并更新已考察的元素中,1和2最早出现的位置即可。另外,更新1, 2位原创 2020-06-12 11:49:41 · 146 阅读 · 0 评论 -
LeetCode Daily Challenge Is Subsequence
文章目录题目大意思路代码总结题目大意判断一个字符串s是否是另一个串t的子序列。子序列指将一个字符串删除若干字符后组成的串。例如abc是assdfbsc的子序列。输入限制:0 <= s.length <= 1000 <= t.length <= 10^4两个字符串都只包含小写字母进阶:假如有超过10亿个s串,一个·t·串,怎么做会更好。思路对于一个s和t来说,可以直接从前往后判断,考虑s中的字符在·t·中最早出现位置即可。但是假如·s·数目较大的话,一个一个判断就不原创 2020-06-09 16:35:11 · 134 阅读 · 0 评论 -
LeetCode ZigZag Conversion
文章目录题目大意思路代码总结题目大意将一个字符串转换为numRows行的zigzag形式,并按行按列输出转换后的字符串。字符串012345678转换为4行的zigzag后如下所示,输出为0615724830 61 5 72 4 83 更长版本的zigzag0 12 24 361 11 13 23 25 352原创 2020-06-06 19:52:41 · 306 阅读 · 0 评论 -
LeetCode Daily challenge - Two City Scheduling
文章目录题目大意思路我的方法代码总结题目大意有2N个人,现将这2N个人送到A, B两个城市,每个人送到不同城市的代价为costs。计算将这2N个人送到不同城市的最小代价,要求每个城市刚好送N个人。思路乍一看有点像动态规划,但是思考后发现有一定的贪心策略在里面。实际上,去A的代价与去B的代价 cost[a] - cost[b] 代表让一个人去B能够节约的钱,反之,cost[b] - cost[a] 代表一个人去A能够节约的钱。而这两组数互为相反数。所以只需计算一组然后选前N个去A,后N个去B。优化,原创 2020-06-03 20:04:05 · 160 阅读 · 0 评论 -
LeetCode Daily challenge - Edit Distance 编辑距离
文章目录题目大意思路代码总结题目大意编辑距离,经典动态规划题目。给出针对字符串的三种操作,替换,删除和插入,编辑距离d,表示将字符串a使用上述三种操作转换为b所需要的步骤。思路计算字符串a和b之间的编辑距离d。子问题构造: a的前缀子串和b的前缀子串之间的编辑距离,前缀子串即包含某位置前的所有字符的子串。因为计算a的前缀子串与b的编辑距离时需要考虑b中的所有字符,因此a和b的子串都要考虑。递推公式: 递推式需要考虑a[i]和b[j]是否相同的情况,例如对于hoe和rose,因为两者最后的原创 2020-06-01 21:34:05 · 171 阅读 · 0 评论 -
LeetCode Daily challenge - K Closest Points to Origin
文章目录题目大意思路代码总结题目大意找前K小元素,只不过元素是二维的坐标思路很容易想到排序后取前K个,虽然可以但是速度不够快。实际上类似于找第K大(小),可以用划分的方法找,每次随机划分,然后判断接下来从哪儿一边找。STL中有partial_sort和nth_element,尽情AC吧。。。。。代码第二种方法的代码。class Solution {public: vector<vector<int>> kClosest(vector<vector<原创 2020-06-01 14:28:29 · 161 阅读 · 0 评论 -
LeetCode Daily challenge - Course Schedule
给出n个课程,以及某些课程的预置课程,某课程的预置课程表示必须先参加预置课程后才能再参加该课程。判断是否可以完成所有的课程。有向图判断是否存在环,DFS,BFS经典题目原创 2020-05-30 17:44:36 · 164 阅读 · 0 评论 -
LeetCode Daily challenge - Counting Bits
给一个整数n,计算0~n每个数的二进制表示中1出现的次数: 利用(x & -x)寻找递推关系。原创 2020-05-29 11:15:10 · 165 阅读 · 0 评论 -
LeetCode Daily challenge - Possible Bipartition
目录题目大意输入思路代码总结题目大意将N个人划分为两组,每个人可能不喜欢其他人,即不能和不喜欢的分到一组,问是否能够成功划分。输入N和dislike[][2]分别表示人的个数和不喜欢的列表。例如N = 4, dislikes = [[1,2],[1,3],[2,4]],表示4个人,其中1与2,1与3,2与4不能分到同一组。思路类似并查集,因为不喜欢是成对出现的,所以记录每个元素所属的集合以及不喜欢的集合。对于不喜欢列表中的每一对(x, y),如若x,y都未加入任何集合 - 以他们自己为根元素原创 2020-05-28 10:31:25 · 211 阅读 · 0 评论 -
使用C++实现kmeans并使用Python可视化聚簇结果
文章目录C++实现过程算法流程数据结构设计代码:Python可视化过程部分截图注: 本文代码及方法仅供参考,请勿直接使用C++实现过程算法流程kmeans - 点作为数据,cluster是点的聚簇BEGIN 选出来 k 个点作为中心点生成聚簇 循环 计算点与聚簇的距离 每个点加入到距离最近的聚簇中 更新聚簇中...原创 2020-02-21 21:48:11 · 829 阅读 · 0 评论 -
Leetcode 5 15 98 138解题记录
文章目录15 3Sum98 验证二叉搜索树5 最长回文子串138 拷贝带有随机指针的链表刷top-100的题目,最近做了这四道,原题:138, 5, 15, 98.15 3Sum给你一串整数,让你找里面所有和为0的三元组。思路: 暴力的话三循环,时间复杂度高。可以考虑先求任意两个数的和a,然后找剩下的数中值为-a的元素,但是复杂度依旧很高。考虑先确定一个数b,那么接下来的任务就是找和为-b...原创 2019-12-22 10:12:21 · 142 阅读 · 0 评论 -
LeetCode 39 Combination Sum
LeetCode 39 Combination Sum题意给出n个互不相同的正整数,找出所有和为target的组合,每个数字可以用多次。思路对于每个数v来说,可以选择取最多k次,k = target / v,也可以选择不取。因此可以使用深搜来解决这个问题。当然如果有做过背包问题的话,可以看到这个问题实际上是动态规划的经典背包问题,具体什么类型我也忘了,不过思路还是比较容易想到的。以输入 ...原创 2019-03-08 16:39:18 · 134 阅读 · 0 评论 -
LeetCode 337 House Robber III
LeetCode 337 House Robber III题意给一个二叉树,从中取任意多个数并使这些数的和最大。要求任意两个直接相连的节点不能同时取到。思路1 暴力深搜时间空间复杂度都没有限制,爆搜来一发。首先,假如选了一个节点,那这个节点的直接孩子都不能选,只能选不直接相连的孩子,因此需要引入一个布尔值表示当前节点是否可选;其次对于每个节点,如果可选的话,我们也可以选择不选这个节点,...原创 2019-03-05 23:54:20 · 147 阅读 · 0 评论 -
LeetCode 581 Shortest Unsorted Continuous Subarray 题解
LeetCode 581 Shortest Unsorted Continuous Subarray 题解题意给定一个数组,找出一个最短的子序列使其满足,只将这个子序列重新排序即可使整个数组有序(升序)。输出这个最短子序列的长度。思路一 排序对比比较容易想到的是将数组排序后与原数组对比。比如样例:未排序 [2, 6, 4, 8, 10, 9, 15]排序后 [2, 4, 6, 8, ...原创 2019-02-20 14:50:13 · 121 阅读 · 0 评论 -
LeetCode 287 Find the Duplicate Number
LeetCode 287 Find the Duplicate Number题意给一个长度为n+1的数组,数组中元素的值再1到n之间(包括1和n),其中有一个元素重复出现了多次,让你求出这个元素。要求时间复杂度小于O(n^2),空间复杂度为O(1),不能修改原数组中的值。思路emmm看讨论版的,英语可以的话建议直接看讨论版高票答案以及高票回复。这个题目很特殊的一点是,数组中每个元素都在1...原创 2019-03-04 23:52:20 · 122 阅读 · 0 评论 -
LeetCode 238 Product of Array Except Self 题解
LeetCode 238 Product of Array Except Self 题解题意给一个数组nums,输出一个新数组output,其中output[i]是原数组中除nums[i]以外,其他所有元素的乘积。要求在O(n)的时间内解决并且不使用除法,而且不使用除了返回结果以外的额外空间。思路前缀积 * 后缀积。首先可以判断出的是,结果不会超过int的最大值,否则返回值也不应该是vec...原创 2019-02-23 11:36:23 · 167 阅读 · 0 评论 -
LeetCode 406 Queue Reconstruction by Height
LeetCode 406 Queue Reconstruction by Height 题解题意给定一组数列,数列中每个元素为一对数(h, k),其中h表示该元素的值,k表示该元素之前所有元素中,值大于等于当前元素值的个数。这个数列被打乱了,要求重新排列这个数列使其正确。思路一 考虑最大元素对于值为最大值的元素来说(可能多个),倘若将它们按照k从小到大排序,会发现他们的k值其实就是他们的...原创 2019-02-17 13:36:05 · 255 阅读 · 0 评论 -
LeetCode 647 Palindromic Substrings
LeetCode 647 Palindromic Substrings题意给一个字符串,求该字符串的所有子字符串是回文串的个数。凡是起始下标或结束下标不同的子串,即便他们的值一样,仍认为是不同的子串。思路由小回文串推大回文串 - 利用已知信息。如果采用暴力求解的方法,那么判断每个子串是否是回文串都需要O(n)的时间。事实上,当我们得到一个回文串aba时,可以通过向两边扩展的方法,判断xab...原创 2019-02-22 15:37:55 · 104 阅读 · 0 评论 -
LeetCode 347 Top K Frequent Elements, 22 Generate Parentheses
LeetCode 347 Top K Frequent Elements AND 22 Generate Parentheses347 Top K Frequent Elements题意给一个非空整数数组,求出现次数最多的K个不同的数,题目保证k有效。要求时间复杂度优于O(nlogn)。思路本以为会有O(n)的方法,但思考不出来,看了讨论版之后发现点赞最多的使用的是unordered_m...原创 2019-03-04 18:07:16 · 125 阅读 · 0 评论 -
LeetCode 139 Word Break 动态规划
LeetCode 139 Word Break题意思路代码总结题意给出一个非空字符串s以及一个字典 - 包含多个非空字符串的列表wordDict,判断字符串s能否由字典中的字符串拼出来,字典中的字符串可以使用多次,字典中不包含重复的字符串。其中一个样例如下:input: s = "applepenapple", wordDict = ["apple", "pen"]output: true...原创 2019-04-10 10:23:21 · 263 阅读 · 0 评论 -
LeetCode 207 Course Schedule
LeetCode 207 Course Schedule题意有0~n-1共n门课你需要进修,其中一些课程需要在修完其他课程后才能进修,例如(0,1)表示要进修课程0你必须先修完课程1。给出课程的总数以及一个列表表示所有的先决条件,问是否可能修完所有课程。注:课程先决条件可以看作是由一个图的边(edge)组成不会出现重复的边思路假如将每个先决条件(a,b)看作是b到a的有向边,整个...原创 2019-04-06 10:06:07 · 124 阅读 · 0 评论 -
LeetCode 309 Best Time to Buy and Sell Stock with Cooldown
LeetCode 309 Best Time to Buy and Sell Stock with Cooldown题意给出一串数组prices,数组中第i个元素代表第i天股票的价格,每天你可以选择购入一张股票或者售出已有股票,但有如下要求:你不能同时参与多个交易,即当你手中有一张股票时你只能在卖出之后才能再次购入股票售出股票后你必须等待一天才能继续购入设计一个算法使受益最大。思路...原创 2019-03-28 20:26:43 · 162 阅读 · 0 评论 -
LeetCode 19 Remove Nth Node From End of List 题解
LeetCode 19 Remove Nth Node From End of List题意思路方法1 指针数组方法2 当前倒数第n个节点代码题意给一个链表,要求删除链表中的倒数第n个节点并返回链表的首节点,数据保证n有效。要求一次遍历得到结果。思路方法1 指针数组将所有的节点指针值存到数组中,遍历之后通过数组直接访问倒数第n个指针,不过这种方法显然有点不太好。方法2 当前倒数第n个节...原创 2019-04-13 11:15:53 · 125 阅读 · 0 评论 -
LeetCode 33 Search in Rotated Sorted Array 题解
LeetCode 33 Search in Rotated Sorted Array题意思路代码总结题意给出一个数组,该数组是由一个升序排列的数组以某个轴旋转后得到的。例如4 5 6 7 0 1 2是由0 1 2 4 5 6 7旋转(我认为是交换)后得到的。给你一个目标值target,要求判断数组中是否存在这个值,存在的话给出它的位置,否则返回-1。注: 数组中无重复数组,要求算法时间复杂度...原创 2019-04-14 14:00:21 · 170 阅读 · 0 评论 -
LeetCode 142 Linked List Cycle II 题解
LeetCode 142 Linked List Cycle II题意思路代码题意判断给出的链表中是否包含环,如果有的话返回环的起始点,否则返回null。如下环起始位置为ca->b->c->d ↑ ↓ f<-e思路双指针一个一次一步,一个一次两步可以进入环中,但问题在于如何找到环的起始位置,下面是从讨论版找到的图,可以参考一下:代码...原创 2019-04-15 11:14:36 · 229 阅读 · 2 评论 -
LeetCode 739 Daily Temperatures
文章目录题目思路代码题目给一个大小为n的数组T,要求对i从0-n,计算出从i + 1开始的第一个大于T[i]的数的位置j,并将j-i的值记录下来。例如对于数组:[73, 74, 75, 71, 69, 72, 76, 73],输出数组为:1, 1, 4, 2, 1, 1, 0, 0。注:数组T不为空,且最多包含30000个元素,每个元素的取值范围为[30, 100]。思路因为是找i之后的...原创 2019-08-02 15:35:59 · 154 阅读 · 0 评论 -
LeetCode 399 Evaluate Division
文章目录题意思路代码题意给出多个形如 a/b=k 的式子以及询问 a/b=?,要求对回答每个询问的结果,若从式子推导不出询问的答案,则返回-1。其中 a, b 为任意字符串,k 为实数。例如:式子:a / b = 2.0, b / c = 3.0询问:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? 答案:6.0, 0.5, -1...原创 2019-09-28 15:56:36 · 144 阅读 · 0 评论 -
LeetCode 438 Find All Anagrams in a String 题解
LeetCode 438 Find All Anagrams in a String 题解 - 滑动窗口题意给出一个字符串 s 和一个非空字符串 p,找出 s 中所有 p 的 anagram 的下标。输入的字符串中只包含小写字母。anagram:任意改变原字符串中字符顺序的所有新字符串,包括原串。例如 abc, bac, acb, bca 都是 abc 的 anagram。思路...原创 2018-11-04 21:25:01 · 184 阅读 · 0 评论