
LeetCode
会飞的蟋蟀
学习中!!
展开
-
LeetCode 572. Subtree of Another Tree
题解题很简单但要写得简洁优雅也不容易。给出的代码递归写得非常漂亮。Codebool isSubtree(TreeNode* s, TreeNode* t) { if(!s) return false; if(isSame(s,t)) return true; // 点睛之笔 return isSubtree(s->le...原创 2018-11-02 11:35:35 · 359 阅读 · 0 评论 -
LeetCode 54. Spiral Matrix && 59. Spiral Matrix II
题解螺旋遍历矩阵大总结,给出一个优雅清晰的解法。大概思路是模拟移动方向,计算xy位置。比如n*m的矩阵,按右下左上的顺序,依次移动的步数是{ m, n-1 , m-1 , n-2, …, 0 } 直到遇到第一个0。其中左右的步数 { m, m-1 , m-2 … }上下的步数 { n-1, n-2, n-3, … }所以可以用个 step[2] = {m,n-1} 来记录剩余步数每...原创 2018-10-25 11:49:07 · 126 阅读 · 0 评论 -
LeetCode 164. Maximum Gap
题解求连续极大差,要求O(n)。利用鸽笼原理。先给出一个前置条件,即最大差不小于(max-min)/(n-1),为什么?想象一个阶梯,阶梯间的最大高度差和平均高度差的关系。有了这个差值,我们可以把原数组依据其所在区间分为n-1个桶。显然落于同一个桶内的数我们不关心,我们只关心相邻桶间的数。n个数,除了最大最小之外,还有n-2个数,入n-1个桶,至少有一个桶没有数。答案就是跨越这个空...原创 2018-10-25 11:07:59 · 142 阅读 · 0 评论 -
LeetCode 209. Minimum Size Subarray Sum
题解最短连续子数组和大于target,这个限制非常强,以至于可以利用该性质,在O(n)内完成判断。详细见第一篇代码。第二篇可改进为O(nlog(n)),利用前缀和数组递增性。CodeO(n)int minSubArrayLen(int s, vector<int>& nums) { int n = nums.size(), start = 0, ...原创 2018-10-22 11:16:20 · 122 阅读 · 0 评论 -
LeetCode 842. Split Array into Fibonacci Sequence
题解比较单纯的深搜,有些坑比如数字溢出。比较一下后两份代码,性能差距明显。Codebool backtrack(string &S, int start, vector<int> &nums){ int n = S.size(); // If we reached end of string & we have mor...原创 2018-10-22 11:02:34 · 376 阅读 · 0 评论 -
LeetCode 714. Best Time to Buy and Sell Stock with Transaction Fee
题解类型这里有一篇极尽完美的足以秒杀所有 stock buy&sell 类型的题解,写的非常完善。给出我觉得重要的点:T[ i, k, b ] 表示到i位为止交易k次情况下 是否(b=0 or 1)持有股票时获得最大收益边界条件T[-1][k][0] = 0, T[-1][k][1] = -InfinityT[i][0][0] = 0, T[i][0][1] = -Infi...原创 2018-10-19 11:13:11 · 119 阅读 · 0 评论 -
LeetCode 179. Largest Number
题解这题见过,本质是排序,只要写个cmp函数就可以了。Codeclass Solution {public: string i2s(int a){ if(a==0) return "0"; string res=""; int tmp; while(a){ tmp=a...原创 2018-10-10 11:32:08 · 88 阅读 · 0 评论 -
LeetCode 78. Subsets && 90. Subsets II
题解也是两题一起写。第二问的差别在于是否有重复数字。这种求组合的,思路大体有三种:dfs,迭代,位操作。dfs不说了很熟悉,我用位操作搞定了第一问,这里关注一下迭代。我叙述一下迭代的过程,例如对{1,2,3},先预设返回值res为{{}}。遍历原数组,对每个数字,依次取得现有返回值res内所有组,加上此数字,再加回res。第一次:{{},{1}}第二次:{{},{1},{2},...原创 2018-10-09 11:36:40 · 171 阅读 · 0 评论 -
LeetCode 394. Decode String
题解看到括号很容易想到栈。用stack的思路就是每遇到一个 ],不停出栈直到遇到对应的 [ 再出栈把数字倒出来。大体思路就是这样。当然我们不需要显式的用stack,用递归也是一样的,我的解法就是递归。这里给几点tips:递归解法是想把原问题分解为小问题,这题的所谓小问题就是decode 一个[]内的字符串。注意只要有数字就会有[],每个[]内可能有数字也可能没有,但必然会有字母。...原创 2018-09-30 11:51:44 · 171 阅读 · 0 评论 -
LeetCode 576. Out of Boundary Paths
题解这道题我觉得难在内容理解,怎么程序表述出这样的一个目的。一开始我想了个bfs的,我想是从起点算移动到某位置时还剩下多少步数,如果剩余步数大于0而该位置在边界上那么该位置+1,最后遍历四周边界位置累加其数字即可。思路正确但是爆内存(剪枝一样爆),而且有点不是很透彻的感觉。看了下dp的题解,觉得舒服多了。三维dp[ i, j , k]:代表从i-j开始走k步能走出界的方法数。这个描述...原创 2018-10-18 15:53:30 · 148 阅读 · 0 评论 -
LeetCode 647. Palindromic Substrings
题解判断是不是回文这个很简单。但是要想办法减少重复计算,这就需要dp或者说记忆化搜索。用数组cot[ i ][ len ] 代表从i 位置起长度为 len 的字串是否是回文,这样我们从一个小的距离遍历的时候就可以回避多余的计算了。Codeclass Solution {public: bool cot[1001][1001]; int countSubstrings(...原创 2018-10-08 10:45:08 · 113 阅读 · 0 评论 -
LeetCode 452. Minimum Number of Arrows to Burst Balloons & 435. Non-overlapping Intervals
题解两题一起写,都是pair型数组,都考虑交叠问题,都是贪心。这类题的核心都在于预先sort一下,以second升序排(若相等再以first升序)。这样的好处是,我们再顺序遍历的时候可以很方便地发现交叠情况:比如用一个 p 变量记载之前的second,新位置比较一下first就知道是否相交。Code452int findMinArrowShots(vector<pair<...原创 2018-10-21 10:35:21 · 151 阅读 · 0 评论 -
LeetCode 870. Advantage Shuffle
题解这题有点田忌赛马的意思。对每个B中的数都找A中最小的大于它的数即可。Code这个map用得花vector<int> advantageCount(vector<int> A, vector<int> B) { map<int, int> m; for (int i : A) m[i]++; ...原创 2018-10-21 11:42:01 · 113 阅读 · 0 评论 -
LeetCode 289. Game of Life
题解不给额外空间该怎么做呢?那就往原来空间里挤一挤。显然,原来矩阵只存储了0-1,用了1位而已,把变化的信息存入第二位就好了。Codevoid gameOfLife(vector<vector<int>>& board) { if(board.empty()) return; int n=board.size(),m=boa...原创 2018-10-26 09:55:05 · 101 阅读 · 0 评论 -
LeetCode 47. Permutations II
题解算所有的排列,有重复数也差不多,都是用递归法。大概递归思路:顺序对每个位置,交换当前位置到此后的某位置,进入下一递归,当前位置加一。Codevoid per(vector<int> a, int i, int j, vector<vector<int>> &res){ // 注意这个 a 不是传引用 if(i...原创 2018-11-02 10:59:55 · 133 阅读 · 0 评论 -
LeetCode 818. Race Car
题解记忆化搜索。这题显然可以化为子问题来考虑的。大体思路:不妨设dp[n]为到达n的最短代码注意可以直接A到且最短的位置为 1,3,7,15, … ,(2^n) -1显然要考虑的情况就是target位于 2^(n-1) -1 ~ (2^n) -1 之间怎么处理这个区间更进一步?两种方法。走到target的后头位置(2^n) -1,此时调头向后走那么还需要走的的最短步数恰好= ...原创 2018-11-06 15:08:56 · 325 阅读 · 0 评论 -
LeetCode 787. Cheapest Flights Within K Stops
题解这题看似最短路径,但是暗藏变化。首先想到dfs,搜索到所有由始至终的可行路径,记录最小cost即可。但是这题编程实现有很多小花招,怎么剪枝,一个是k(步进的次数),二是cost,都可以用来减小搜索空间。再者,就是贝尔福特算法,非常适合这题,因为此题有个k的限制。当然应用的时候需要修改一点,原本是重复|V|-1次的,此时只要k+1次了。值得注意的是,在每一轮更新dis[]数组的时候...原创 2018-11-03 13:01:27 · 304 阅读 · 0 评论 -
LeetCode 92. Reverse Linked List II
题解反转链表大家都会写,但是怎样写得优雅简洁是个问题。这题要求反转一定区间的链表,有一点注意就是起点可能是头结点。pre有可能是null,这不优雅,所以我们新建一个New_head节点代表一个虚拟的头部最后只要return New_head-&gt;next就好了。ps:下面贴了两种反转实现,比较一下。Code冒泡式反转链表ListNode* reverseBetween(List...原创 2018-11-01 11:45:05 · 143 阅读 · 0 评论 -
LeetCode 675. Cut Off Trees for Golf Event
题解排序+BFS最短路。思路比较直接吧,按树高顺序依次求之间的最短路径。注意这次BFS的写法不太一样,不用开等大小矩阵存最短长度。Codeint dx[4]={0,1,0,-1};int dy[4]={1,0,-1,0};int cutOffTree(vector<vector<int>>& forest) { if(forest.e...原创 2018-10-27 10:21:46 · 173 阅读 · 0 评论 -
LeetCode 319. Bulb Switcher
题解自然地会想到模拟开关的方法,开一个数组记录开关情况,最后奇数者亮。例如int bulbSwitch(int n) { vector<int> cot(n+1,1); int res=0; if(n==1) return 1; for(int pos=1;pos<=n;pos++){ ...原创 2018-10-24 15:08:11 · 146 阅读 · 0 评论 -
LeetCode 825. Friends Of Appropriate Ages
题解看似简单,其实也简单,就是出题人故意挖了坑等你跳。第一坑,冗余条件3,和2一个意思。第二坑,排序无能,爆时间。躲了这俩坑就基本明白了,就是桶排序。ps: 我的代码还可以优化,可以再缩减遍历的空间。Codeint cot[121];int numFriendRequests(vector<int>& ages) { int n = ages....原创 2018-10-24 11:20:46 · 181 阅读 · 0 评论 -
LeetCode 835. Image Overlap
题解这题暴力遍历也行,枚举起始点就好。但是暴力法做了太多无用计算,其实我们只关心有1的位置。那么我们可以把有1的位置信息提取出来,然后比较当这两组的1碰撞在一起时候的总数即可。CodeO(n^2+AB)int largestOverlap(vector<vector<int>>& A, vector<vector<int>>&a...原创 2018-10-24 10:40:02 · 440 阅读 · 0 评论 -
LeetCode 918. Maximum Sum Circular Subarray
题解最大连续子数组和大家都会做了,就一句话:cur_max=max(cur_max+nums[i],nums[i])这次是环型数组怎么办?想法一:两组首位拼成2n长的数组,再求最大连续和。可行否?可想法二:因为最大连续和可能在两组中间,求起来比较麻烦,但是转换一下这时最小连续和肯定在一个数组不会跨界,用总和-最小=最大和 bingo!!Codeint maxSubarraySu...原创 2018-10-26 12:51:53 · 425 阅读 · 0 评论 -
LeetCode 470. Implement Rand10() Using Rand7()
题解这题关键在于创造的随机数分布要均衡。先看这个比较trick的解法。int rand10() { int i,j; while( (i=rand7())<6 );// 让i分布于 6 or 7 则P(i=6 or 7)=0.5 while( (j=rand7())>5 );// 让 j 分布于 1-5 则P(j=1:5) = 0....原创 2018-10-29 11:23:56 · 226 阅读 · 0 评论 -
LeetCode 406. Queue Reconstruction by Height
题解这题可以巧妙地被结构为一道插排问题。先sort,h从大到小排,h相同按k数从小到大。此时数列前方的大的数已经成为一个局部完整序列了。因为小h不会影响大h的k正确性,然后慢慢考虑后面的h要插入哪里就可以了。这不就是插入排序么。Codeclass Solution {public: static bool cmp(pair<int, int> &a, ...原创 2018-10-08 10:13:34 · 150 阅读 · 0 评论 -
LeetCode 48. Rotate Image
题解这题只要有点分解的意识就好了。旋转矩阵其实就是在按照顺时针顺序依次swap一行/列,如下图。每完成一个 口字再往内部走就是个更小的 口字。 4 - - - |3 | | 1 | | | - - - ...原创 2018-09-28 11:54:19 · 100 阅读 · 0 评论 -
LeetCode 62. Unique Paths
题解很常见的矩阵位移类的dp,naive的做法是开个同大小的dp[m , n],然后 dp[ i , j ] = dp[ i-1 , j ] + dp[ i , j-1 ]。这样空间开销比较大,注意到dp[ i , j ] 的更新只依赖于上和左,那么其实用两行数组就可以。其实还可以优化到一组: dp[ i ] += dp[ i-1 ],哈哈Code不给了太简单...原创 2018-09-28 11:01:05 · 93 阅读 · 0 评论 -
LeetCode 684. Redundant Connection [模版]
题解这题就是并查集。然后我想总结下并查集的写法。主要实现两块,union & find。设p[ i ]代表 i 的父类。find() 主要就是查找i的父类集合// 无修改int find_1(int i){ while(p[i]!=i) i=p[i]; return i;}// 压缩路径int find_2(int i){ if(p[i]!=i) p[i...原创 2018-10-11 11:43:06 · 257 阅读 · 0 评论 -
LeetCode 207. Course Schedule
题解这题就是拓扑排序,也可以dfs查环,思路简单,注意下如何用数据结构表示。可参考的英文题解含DFS/BFSCodeclass Solution {public: bool canFinish(int n, vector<pair<int, int>>& pres) { vector<unordered_set<int...原创 2018-10-02 15:26:15 · 165 阅读 · 0 评论 -
LeetCode 56. Merge Intervalse
题解检验区间交叠,思路比较直观,先排序再比较,看代码。前面我的,后面的最精炼。O(n^2)class Solution {public: static bool cmp(Interval &a,Interval &b){ return a.start < b.start; } bool used[50000]; ve...原创 2018-09-26 13:13:17 · 117 阅读 · 0 评论 -
LeetCode 416. Partition Equal Subset Sum
题解这题就是01背包,特征就是选与不选对吧。但是这题又有点变化,不是算max min 或者方案数,而是确定解是否存在,料想dp应为bool型。dp[ i , j ] : 代表在前i个数中,是否能取得和为j。转移方程很合理:dp [i , j] = d[ i-1, j ] || dp [ i-1, j - nums[i] ] // 取 或 不取ps: 注意dp[0 0] = true。显...原创 2018-10-02 11:32:18 · 131 阅读 · 0 评论 -
LeetCode 22. Generate Parentheses
题解这题很巧,虽然还是个dfs。用两个变量n,m记录待放入的左右括号,放一个左则n-1,m+1,放一个右m-1,如此反复可得。Codeclass Solution {public: vector<string> generateParenthesis(int n) { vector<string> res; dfs(res...原创 2018-09-26 11:10:26 · 85 阅读 · 0 评论 -
LeetCode 39. Combination Sum
题解这种求sum的题目核心思路就是遍历,没其他的东西。这题就是个dfs,注意回避重复(用序号开始)。ps: 看别人答案,函数上套那么多变量真是看得好难受。。。Codeclass Solution {public: vector<vector<int>> ret; vector<int> cot; int cur_sum; ...原创 2018-09-26 10:39:30 · 90 阅读 · 0 评论 -
LeetCode 279. Perfect Squares
题解很多解法,包括不限于dfs,dp,甚至数学解法(最快)。给出dp解法dp [ i ] : 代表对 i 拥有的最少平方和数量。易得dp[ i ] = min{ dp[ i - k*k ] | k= 1,2,3… && k*k <= i }Codeclass Solution {public: int dp[10000]={0}; i...原创 2018-10-01 13:51:31 · 114 阅读 · 0 评论 -
LeetCode 560. Subarray Sum Equals K
题解看到连续子序列和,必然想到前缀和。但是光有前缀和这题还做不了,如何使得和为目标数目呢?此题和前面做过的一道4SUM有点像,关键还是用map来存储便于查询。设想 map[ sum ] 表示前缀和为sum的数量,那么当我们累计算得当前位置的和为sum时,我们考察 map[ sum - k ] 的数量,这就是一份使得 目标数k 成立的答案。看代码,很巧。Codeclass Solut...原创 2018-10-01 12:50:20 · 166 阅读 · 0 评论 -
LeetCode 49. Group Anagrams
题解这题就是哈希,让同样char的组合有同样的键值,注意防碰撞。用了素数表,字符数位的素数做乘积作为键。ps: 平时不写java,临时写一下遇到无数bug。常见的与c++ api 不同的就算了。比如 Arrays.asList(str),只可读不可写。。。List<List> 与 ArrayList< ArrayList > 不匹配。。。Codeclas...原创 2018-10-01 11:43:50 · 126 阅读 · 0 评论 -
LeetCode 454. 4Sum II
题解4sum变种,本质还是枚举,但是4个数组遍历要O(n^4),有咩有办法减少时间呢? 空间换时间吧。4组两两分着遍历,将其中两组的和用Map记录下来,另外两组求和后在Map中 找到负和就可以了。ps: java.xxx.map getOrDefault(object,v),寻找键值若无返回缺省的v。Codeclass Solution { public int f...原创 2018-09-14 16:32:30 · 86 阅读 · 0 评论 -
LeetCode 781. Rabbits in Forest
题解这题很有意思。想想,有兔子说有 x 个同色兔子,那么其实就是说有 x+1 个兔子同色。换言之,这个 x 最多可以在数组中重复 x+1 次,但是显然 x 可以出现任意次。少于 x+1 就意味着有部分兔子没说话,多余则表示还有另外颜色的兔子也有 x+1 个。所以,此题用map记录 x 的次数。然后算 (x+1) * ceil( map[x]/(x+1) )即可。Codepubli...原创 2018-10-11 12:22:29 · 210 阅读 · 0 评论 -
LeetCode 33. Search in Rotated Sorted Array
题解有点变化的二分查找。注意这题的test case中有不变的,即数组可能rotate也可能不。思路也是差不多的,设有left right mid 三个index。注意mid可能有三种情况,1和2只能这么写才能…nums[mid] > nums[right]nums[mid] < nums[left]normal目的就是想办法将这个rotate数组分割成正常的升序数组...原创 2018-10-03 14:35:48 · 100 阅读 · 0 评论 -
LeetCode 494. Target Sume
题解之前在luogu上做过一道类似的题,但是更难点还要考虑空格。记得也写过题解的但是找不到了。。。这道简化了点,所以我用dp来做一下,思路比较清晰。dp[ i , j ] : 表示前 i 个数组合成总和 j 的方案数有转移方程:dp[ i , j ] = dp[ i-1 , j - nums[i] ] + dp[ i-1 , j + nums[i] ]这很显然吧。注意j不能为负数,所...原创 2018-09-27 10:24:23 · 112 阅读 · 0 评论