- 博客(120)
- 收藏
- 关注
原创 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 307
原创 LeetCode 787. Cheapest Flights Within K Stops
题解这题看似最短路径,但是暗藏变化。首先想到dfs,搜索到所有由始至终的可行路径,记录最小cost即可。但是这题编程实现有很多小花招,怎么剪枝,一个是k(步进的次数),二是cost,都可以用来减小搜索空间。再者,就是贝尔福特算法,非常适合这题,因为此题有个k的限制。当然应用的时候需要修改一点,原本是重复|V|-1次的,此时只要k+1次了。值得注意的是,在每一轮更新dis[]数组的时候...
2018-11-03 13:01:27 285
原创 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 344
原创 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 126
原创 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 135
原创 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 212
原创 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 165
原创 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 403
原创 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 89
原创 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 117
原创 LeetCode 164. Maximum Gap
题解求连续极大差,要求O(n)。利用鸽笼原理。先给出一个前置条件,即最大差不小于(max-min)/(n-1),为什么?想象一个阶梯,阶梯间的最大高度差和平均高度差的关系。有了这个差值,我们可以把原数组依据其所在区间分为n-1个桶。显然落于同一个桶内的数我们不关心,我们只关心相邻桶间的数。n个数,除了最大最小之外,还有n-2个数,入n-1个桶,至少有一个桶没有数。答案就是跨越这个空...
2018-10-25 11:07:59 136
原创 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 131
原创 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 167
原创 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 423
原创 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 111
原创 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 362
原创 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 104
原创 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 133
原创 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 110
原创 LeetCode 576. Out of Boundary Paths
题解这道题我觉得难在内容理解,怎么程序表述出这样的一个目的。一开始我想了个bfs的,我想是从起点算移动到某位置时还剩下多少步数,如果剩余步数大于0而该位置在边界上那么该位置+1,最后遍历四周边界位置累加其数字即可。思路正确但是爆内存(剪枝一样爆),而且有点不是很透彻的感觉。看了下dp的题解,觉得舒服多了。三维dp[ i, j , k]:代表从i-j开始走k步能走出界的方法数。这个描述...
2018-10-18 15:53:30 139
原创 luogu P1955 [NOI2015]程序自动分析
题解并查集+离散化。这题并查集使用起来有个小trick,就是先把e=1的先合并再考虑e=0的,这样可以回避掉因为顺序不一导致的又合又分的情况。第一次碰见离散化。大意是把大范围数转化为小范围的数,转化方法是根据其在原数组内的相对位置。例如{ 9783, 123 , 31342432, 231324 }->{ 123, 9783, 231324, 31342432 }->...
2018-10-17 11:54:10 113
原创 LeetCode 554. Brick Wall
题解这题算是哈希的妙用,看代码体会一下。值得注意的是map与unordered_map 的效率差别很大。给出一篇文章比较map 与unordered_map Codeint leastBricks(vector<vector<int>>& wall) { int res=0; if(wall.empty()) return...
2018-10-12 09:57:49 142
原创 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 201
原创 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 243
原创 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 78
原创 LeetCode 78. Subsets && 90. Subsets II
题解也是两题一起写。第二问的差别在于是否有重复数字。这种求组合的,思路大体有三种:dfs,迭代,位操作。dfs不说了很熟悉,我用位操作搞定了第一问,这里关注一下迭代。我叙述一下迭代的过程,例如对{1,2,3},先预设返回值res为{{}}。遍历原数组,对每个数字,依次取得现有返回值res内所有组,加上此数字,再加回res。第一次:{{},{1}}第二次:{{},{1},{2},...
2018-10-09 11:36:40 146
原创 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 104
原创 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 140
原创 LeetCode 152. Maximum Product Subarray
题解连续子序列最大乘积。和最大连续和有点相似,但差别明显。大概也会用dp[ i ] 代表以 i 为终点的最大积?不行因为数列中有负数,负数会瞬间改变前一位的最大积使之变最小。观察到最大最小的这种即时变化,所以我们要把两者都进行记录。cur_max = max( max( cur_max*nums[i], cur_min*nums[i] ),nums[i] );cur_min = min...
2018-10-06 11:58:37 256
原创 LeetCode 55. Jump Game && 45. Jump Game II
题解LeetCode 上这种题目的变形非常多。因为比较相似这次两题一起写,思路比较连贯一点。第一题 55. mid 难度。这题只要判断能否到达尾部。我们用一个变量cur_max记录可到达的最远位置,遍历数组即可。注意此处出现的span数组,意为在i处时能到达的最远位置,这是此题的关键。第二题 45. hard。 也不难,算最小步长,但是测试用例里有一个case卡时间。最小最大,很明显是...
2018-10-06 10:38:17 145
原创 LeetCode 221. Maximal Square
题解这道题在luogu上遇过,还有更烦人的类型比如算对角长度的。dp解之,比较简单 大体思路就是dp[i,j]代表以[i,j]为右下角的方块长度然后根据dp[i-1,j-1]和两边长度,遍历计算即可。Codeclass Solution {public: int maximalSquare(vector&lt;vector&lt;char&gt;&gt;&amp; matri...
2018-10-05 11:24:35 193
原创 LeetCode 236. Lowest Common Ancestor of a Binary Tree
题解求解最近公共父节点,比较经典的题目。思路是二路dfs。沿着左右下行,终结条件是 空节点 或者 root==(p or q)。那么此时,Left Right 有三种情况均非空:左右两子树刚好各有一个目标节点,此时root就是父节点。一空一非空:空端子树没有目标节点,非空一端子树为父节点。双空:舍弃。为什么这样可行,因为递归作用下,但凡返回的是非空那么该子树必然至少含有一个目标节...
2018-10-05 10:47:55 99
原创 LeetCode 215. Kth Largest Element in an Array
题解比较经典的题了,当然经典也意味着解决方案很成熟了。快排变体,堆排,插入选择都可以做。Codeclass Solution {public: int findKthLargest(vector<int>& nums, int k) { /* heap sort priority_queue<int&g...
2018-10-05 09:57:22 181
原创 LeetCode 148. Sort List
题解链表的归并排序,注意怎么二分,比较简单。Codeclass Solution { public ListNode sortList(ListNode head) { if(head==null || head.next == null) return head; ListNode pre=null,slow,fast; ...
2018-10-04 14:10:40 603
原创 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 92
原创 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 160
原创 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 118
原创 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 106
原创 LeetCode 560. Subarray Sum Equals K
题解看到连续子序列和,必然想到前缀和。但是光有前缀和这题还做不了,如何使得和为目标数目呢?此题和前面做过的一道4SUM有点像,关键还是用map来存储便于查询。设想 map[ sum ] 表示前缀和为sum的数量,那么当我们累计算得当前位置的和为sum时,我们考察 map[ sum - k ] 的数量,这就是一份使得 目标数k 成立的答案。看代码,很巧。Codeclass Solut...
2018-10-01 12:50:20 154
原创 LeetCode 49. Group Anagrams
题解这题就是哈希,让同样char的组合有同样的键值,注意防碰撞。用了素数表,字符数位的素数做乘积作为键。ps: 平时不写java,临时写一下遇到无数bug。常见的与c++ api 不同的就算了。比如 Arrays.asList(str),只可读不可写。。。List<List> 与 ArrayList< ArrayList > 不匹配。。。Codeclas...
2018-10-01 11:43:50 119
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人