随笔分类 - LeetCode
摘要:方法一:Backtracing+Memoization 遇到在wordlist里的单词就继续深搜,memo[i] 用来保存下标i开始到结束的字符串是否能拆分,如果之前保存过,就直接返回,不用重复计算。 用start记录开始的下标,这样就不用传字符串作为参数了,当然用字符串也可以。 如果不用memor
阅读全文
摘要:归并排序的应用。本题将一个链表分为两个有个技巧,就是快慢两个指针,需要注意的是如果一开始 slow=fast=head 来做,后面是 fast=slow->next; slow->next=NULL 的话在两个元素的时候会死循环,因此要么改前面要么改后面。
阅读全文
摘要:经典问题,可以用迭代或是递归来做。迭代也有多种思路,一定要注意各种边界条件。 解法一:直接反转,顾名思义,要记录前面的结点信息,才能反转。能背下来最好。 解法二:把后面的结点依次放到最前面。first指针始终指向初始第一个节点,后面的节点依次挪到最前面。 解法三:递归。可以画图帮助思考,尤其是 he
阅读全文
摘要:解法一:Priority Queue 优先队列实际是对每次对list头结点依次比较排序的一种优化。插入和删除时间复杂度都为O(logk)。一共n个数的话总共是O(nlogk)。 复习一下优先队列的写法。 解法二:Divide and Conquer
阅读全文
摘要:解法一:Monotone Stack 用栈来解决本问题是一种很巧妙的解法,主要运用单调栈。由于面积受制于高度较低的矩形,因此由高至低来处理(最高的宽度为1,其相邻的次高的宽度可以用到最高的,为2,以此类推)。所以本题采用递增的栈,遇到小的元素就pop直至栈顶元素<=当前元素,对于pop出来的元素(一
阅读全文
摘要:Recursive 递归处理字符串的题,思路很简单,如果遇到数字,把数字找出来,后面必然是'[',然后 res += decodeString(括号里的内容)。 但是括号内的内容很难直接找到,如果用 while(s[i]!=']') 来找,一旦遇到括号嵌套就会出错。因此,可以把括号的处理放入递归内做
阅读全文
摘要:这两道题很有意思,由于元素为1~n,因此每个元素的值-1(映射到0~n-1)就可以直接当做下标。这样将 nums 中对应下标的元素 *-1 以i表示 index+1 这个元素出现过了,能节省存储的空间。 448. Find All Numbers Disappeared in an Array 44
阅读全文
摘要:本题是 找最大top k 的类似问题,而求解最大top k的解法很经典。 将前k个元素建立一个大小为k的小顶部堆,直接建堆时间 O(k)。如果顺序加入到堆中则需要 k*O(logk)。 对于剩下的 n-k 个元素,如果元素小于堆顶元素,不用管;如果大于,替换掉堆顶元素,并重新维护最小堆的性质。代码实
阅读全文
摘要:5. Longest Palindromic Substring 暴力的话需要枚举开始下标i,结束下标j,并判断该字串是否为回文,需要O(n^3)时间。很明显,通过暴力并判断字串是否为回文效率很低,其并没有考虑到回文的性质。 方法一:DP bool dp[i][j] 表示下标 i~j 的字串是否为回
阅读全文
摘要:树的问题,递归来做。这道题考虑起来有些绕,记录一下。 对于任意一个节点,通过这个节点的最长路径是 以左节点为端点的最长路径+以右节点为端点的最长路径 因此 写一个函数 int dfs(TreeNode *root) 来计算以root为端点的最长路径,通过这个节点的最长路径在函数里计算并更新max即可
阅读全文
摘要:方法一: BFS。用普通BFS来做的话,需要记录结点的depth,每次depth大于max_depth的时候更新答案。或者也可以根据队列的size循环,每次循环第一个就是该层最左边的结点。 有一种巧妙的方法就是按照先右子树后左子树的方式层次遍历,这样最后一个出队列的一定是最左边的结点。 方法二: D
阅读全文
摘要:下标间距<=k,立马就想到滑动窗口,维护一个大小为k的区间。 方法一: 对于新的数,维护区间大小的同时,需要判断该区间中是否存在 [num-t, num+t] 的数字。由于需要根据大小查找,可以利用大小为 k 的 set 作为维护的区间,set 是有序的,因此可以调用 lower_bound 找到第
阅读全文
摘要:最先想到的是暴力,需要枚举矩形左上角和右下角两个点,需要四重循环。 进一步思考优化的方法。枚举矩阵的两行row1,row2,然后枚举列col,如果两个交点都为1,说明这一组点是可以作为矩形的端点的。在row1与row2上,如果有n组这样的点,说明可以构成n*(n-1)/2个矩形(就变成数轴上n个点能
阅读全文
摘要:求总数而不用给出方案,很可能是动态规划问题。有两种思路都可以做,本质是一样的:都是对当前颜色与前一个颜色是否相同进行分类。 思路一: dp[i] 表示到下标i为止的方案数。dp[n-1] 为所求。 dp[i] 由两种情况构成: 如果 i-1 颜色与 i 颜色相同,则 dp[i] = dp[i-2]
阅读全文
摘要:字符串处理的问题,有几个点要注意。 string 里的 find(), find_first_of(), find_first_not_of() 如果没找到,返回string::nops。 C++ reference 中 npos 是这样描述的: This constant is defined w
阅读全文
摘要:脑筋急转弯题。 先从石头数量较少考虑,假设当前是我的回合,如果还剩石头数量为1,2,3,我能够获胜。如果石头数量为4,我必定会输。 现在考虑石头更多的情况:还是我的回合,如果石头数量是5,6,7,我可以将4堆石头留给对手,我必胜。如果石头数量是8,对手一定会将4留给我,我必败。 石头数量更多的情况也
阅读全文
摘要:不能用加减法,想到用位运算解题。 本题思路可见 http://www.cnblogs.com/grandyang/p/5451942.html 关于位运算部分总结 可见 https://blog.csdn.net/fly_yr/article/details/51144272
阅读全文
摘要:求海明距离,将两个数按位异或,然后计算结果中bit 1的位数即可。其实就是 191. Number of 1 Bits 的问题。 计算二进制数中bit 1的位数,有一种经典的算法,Brian Kernighan's algorithm。 n ^ (n-1) 可以将较低位的1置为0。不同于上面的方法需
阅读全文
摘要:方法一: 树的问题,第一想法就是递归。用start和end来确定数组区间,[start,end)。 这里又用到了 STL 的 max_element。主要运用如下: max_pos = max_element(v.begin(),v.end()) - v.begin(); max_num = *ma
阅读全文
摘要:题目要求不能用除法,只能老老实实乘。 记 left[i] 为从左乘到 a[i-1],right[i] 为从右乘到 a[i+1],则 res[i] = left[i]*right[i] 。 由于 left[i] 和 right[i] 都只依赖前一个状态,因此可以用一个变量来代替数组。 这道题给人一种强
阅读全文

浙公网安备 33010602011771号