随笔分类 - LeetCode
摘要:难点:跟踪前一个节点,正确清除右节点 1 class Solution { 2 public: 3 void flatten(TreeNode* root) { 4 if(root==NULL) 5 return; 6 TreeNode* head=root; 7 stack<TreeNode*>
阅读全文
摘要:这道题目关键是先得到上下两层的起始节点,然后分几种情况分别处理:1.下层节点是上层节点的左子节点,且上层节点的右子节点非空。2.下层节点是上层节点的左子节点且上层节点的右子节点为空,或者下层节点是上层节点的右子节点。3.上层节点没有孩子。 分清楚了情况就简单了。
阅读全文
摘要:这个题比前序遍历难在,当tmp等于NULL时,stack需要不断地弹出节点,直到检查到一个节点,它的右节点不为空而且还没有被遍历过。这个判断条件写出来还是比较难。 当然,另一种巧妙的做法是,用前序遍历(按右根左的顺序)来求得数组,然后把数组做一个翻转就行。
阅读全文
摘要:递归前序遍历比较简单,非递归则需要用栈来设计遍历方法。 注意有栈为空但还未遍历完整棵树的情况,因此判断条件需要判断tmp是否为NULL
阅读全文
摘要:这道题一个直观做法是对二叉树进行前序遍历,遍历时跟踪路径,当遍历到一个指定节点时,就把路径记下来。然后对比找到的两条路径,找出最后一个相同的节点。 另一个想法是,找到最小子树能够包含这两个节点。因此编程时可以考虑,如果找到了一个节点,就返回该节点,因为另一个节点如果在别的子树上,继续寻找就没有意义;
阅读全文
摘要:原理很简单,不能用乘除取模,一般总是用位运算,左移或者右移。左移一次相当于乘以2。直到乘到比被除数大为止,用被除数减去前一个数,并记录下乘以2的次数。然后对产生的差值迭代做上述操作。直到差值小于除数为止。此外,labs函数是abs的扩展,记下用法。 class Solution { public:
阅读全文
摘要:想着用动态规划的方法,有点类似于n*n的网格,从(0,0)开始走到(n-1,n-1)有几种方法。当然必须满足纵坐标大于等于横坐标,还有必须记录到达每一个点所走的方法(这里指的是有多少不同的字符串)。 class Solution { public: vector<string> generatePa
阅读全文
摘要:这题和LC76 Minimum Window Substring可以归为一类,就是给出要找的字符(字符串)和相应个数,利用滑动窗口在另一个字符串上找。类似的题目还有LC3。 首先需要用map把出现的单词和相应出现的次数记录下来。 然后维护一个窗口,一步步往前移动。每移动一次就检查是否满足条件。解题时
阅读全文
摘要:还是利用深搜的思想,注意一个元素可以取无数次。而LC40 Combination Sum II 就有次数限制,有次数限制的情况下可以先判断一个数是否与它前面的数相等,若相等则跳过该元素,直到找到一个数与它前面的数不等,再进行深搜。 这里附上LC39的代码 1 class Solution { 2 p
阅读全文
摘要:可以用类似于DFS的方法去做。这道题目是LC78 Subsets的子问题。 对于LC78,另一个巧妙的做法是:我们可以先用一个整形数组(长度和nums相等),数组元素一开始都是1。把整个数组看成一个二进制数,然后模拟二进制减法,将这个数组一步一步减1减到0。每减一次1,对照这个二进制数组和nums数
阅读全文
摘要:这道题目有两种做法,第一种是把排列一直列到第k个。另一种做法是利用康托编码,如果把n!个排列根据首个数字大小排列成n组,则每一组有(n-1)!个元素,求第k个排列,可以先令p=k/(n-1)! 求出第一个数字num[p]. 然后递归做下去。更新数字k=k%(n-1)!,并在数组num中删除num[p
阅读全文
摘要:有关排列的题目,如果用DFS去做,就十分低效。这里介绍一种做法:求下一个序列,先从尾部开始找最长的递增数组,如果从尾到头都是递增,则这已经是最大序列,下一个序列就是将最大序列翻转一下。如果不存在递增数组,则将最后两位数交换一下。其他情况,则记录下递增数组的前一位数,并找出递增数组中比这个数大的最小的
阅读全文
摘要:典型的动态规划题,和《剑指offer》中的矩形覆盖题相似,只不过要考虑不同的边界情况。 另外对于《剑指offer》中的矩形覆盖题,值得考虑的是当矩形是n*n时,会有多少种覆盖的情况? 1 class Solution { 2 public: 3 int numDecodings(string s)
阅读全文
摘要:本质上是用BFS进行层序遍历,难点在于如何记录层的信息。 简单想法是可以用两个queue进行轮流操作。这里记录一种递归的做法。 1 class Solution { 2 public: 3 vector<vector<int> > levelOrder(TreeNode *root) { 4 vec
阅读全文
摘要:回文串判断,需要学习这段代码中transform,tolower,isalnum函数的使用。这种函数可以节省时间,比如判断是不是字母或者字符的函数isalnum。 另外就是要学着用auto类型。 回文串判断其实就是用头尾两个指针一个个判断过去,没什么好方法。当然还有衍生出来的题目,比如判断一个字符串
阅读全文
摘要:这道题一开始就没什么明确的正确想法,大致想着把树深度遍历,然后在遍历路径的上做文章,找到两条路径,这两条路径分别是树中部分结点相加之和第一大和第二大的路径。对这两条路径的头结点找最近公共祖先,然后看看这两条路径相连起来会不会是一个更大的和。找每条路径的基本思路来自求一个数组子数组的最大和题目。但最终
阅读全文
摘要:这道题有个小陷阱,就是代码中必须用(n%2==0)来判断而不能用(n%2==1)来判断。 因为n=-2147483648时,-n=-2147483648,如果用(n%2==1)来判断,在递归的时候会遇到某些负奇数,它们应该算是归类到(n%2==1)的那一类,但由于负奇数%2 1, 所以会造成不正确的
阅读全文
摘要:这种字符串题目,初看不好着手,八成又是动态规划题。用动态数组可以减少空间需求,这里没用。此外注意下第一行的初始化,和平常动归题略有不同。
阅读全文
摘要:可以设置一个变量记录能到达最右边的位置,如果该位置大于数组长度则返回true。否则每前进一步,更新下这个能到达最右边的位置变量。 或者可以用逆向思维,要达到最后一个,首先必须能达到前面位置中的某一个。这里采用逆向法。
阅读全文
摘要:一道字符串题,在没有想到用动态规划前感觉无从下手。注意动态规划的初始化操作。 1 class Solution { 2 public: 3 int minDistance(string word1, string word2) { 4 if(word1.size()==0||word2.size()
阅读全文
浙公网安备 33010602011771号