LeetCode
葛俊在新泽西
本人微博:葛俊在新泽西
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Crack LeetCode 之 32. Longest Valid Parentheses
Leetcode link: https://leetcode.com/problems/longest-valid-parentheses/description/本题非常适合在面试中使用,因为需要面试者综合考虑各种情况,并且题目短小可以在面试时间内完成。本题有3个要点:1. 这类检查括号的题目一般会用栈做数据结构。左括号入栈,右括号出栈。2. 综合考虑各种情况。例如下面代码所示,遇...原创 2018-08-25 15:35:23 · 178 阅读 · 0 评论 -
Crack LeetCode 之 23. Merge k Sorted Lists
https://leetcode.com/problems/merge-k-sorted-lists/本题有两种解法,一是采用之前归并排序里面的merge函数把链表两辆合并;二是采用堆算法,具体参考这个链接:https://blog.youkuaiyun.com/linhuanmars/article/details/19899259解法一的时间复杂度是O(n log(n)),空间复杂度是O(1);解...原创 2018-12-03 13:04:42 · 147 阅读 · 0 评论 -
Crack LeetCode 之 148. Sort List
https://leetcode.com/problems/sort-list/对于链表的排序,非常适合用归并排序算法。但本题还要求只用O(1)的内存空间;如果考虑归并算法的栈的话,实际上本题的解法使用的是O(n)的内存空间。所以本题解法的时间复杂度是O(n Log(n)),空间复杂度是O(n)。其实归并排序也可以使用遍历的方法实现,每次遍历使用不同的步长即可,但是本人懒得修改了~~C++...原创 2018-12-01 23:22:12 · 142 阅读 · 0 评论 -
Crack LeetCode 之 124. Binary Tree Maximum Path Sum
https://leetcode.com/problems/binary-tree-maximum-path-sum/本题的难点在于每条路径可以由树中的任意两个节点相连组成,解题方法还是递归。需要注意的是递归函数的返回值不是子树的和,而是包含根节点的左子树、根节点或者包含根节点的右子树,这也是本题的递归函数和其他题目不同的地方。本题的时间复杂度是O(n),空间复杂度也是O(n)。以下是C++代...原创 2018-11-27 12:11:11 · 125 阅读 · 0 评论 -
Crack LeetCode 之 101. Symmetric Tree
原题链接:https://leetcode.com/problems/symmetric-tree/本题有递归和遍历两种做法,对于遍历,其实是广度优先遍历。以下分别给出了c++和python版本的实现。其实思路一旦清楚了,代码并不复杂。class Solution {public: bool isSymmetric(TreeNode* root) { if (root == NU...原创 2018-11-26 22:23:24 · 141 阅读 · 0 评论 -
Crack LeetCode 之 136. Single Number
https://leetcode.com/problems/single-number/所有数取异或,最终结果就是那个单一的数,这是因为相同的两个数异或的结果为0。算法的时间复杂度为O(n),空间复杂度为O(1)。c++代码如下:class Solution {public: int singleNumber(vector<int>& nums) { if...原创 2018-11-25 15:05:22 · 124 阅读 · 0 评论 -
Crack LeetCode 之 128. Longest Consecutive Sequence
原题链接:https://leetcode.com/problems/longest-consecutive-sequence/解题思路是,建立一个哈希表,然后loop整个集合,对于每个数字可以通过查询哈希表检查其周边的数字是否连续;如果连续的话则保存最大的连续长度,并且将该数字从哈希表中删除。最大的连续长度就是结果。该算法的时间复杂度为O(n),空间复杂度也是O(n)。c++代码如下:...原创 2018-11-25 10:18:29 · 156 阅读 · 0 评论 -
Crack LeetCode 之 127. Word Ladder
https://leetcode.com/problems/word-ladder/本文的解釋部分來自於鏈接,出於學習目的我租了部分整理和修改:https://blog.youkuaiyun.com/linhuanmars/article/details/23029973本題的本質是图,圖的顶点则是每个字符串。因為每次只能改一個字符,所以該字符串的每个字符可能对应的边有25个(26个小写字母减去自己)...原创 2018-11-18 16:30:50 · 156 阅读 · 0 评论 -
Crack LeetCode 之 133. Clone Graph
Leetcode link: https://leetcode.com/problems/clone-graph/本题要求克隆一个图。这里需要的注意的是,每个节点的相邻节点可能有重复,所以需要一个map检查重复节点。另外,本题还有两个解法:深度优先遍历和广度优先遍历。可以参考https://blog.youkuaiyun.com/linhuanmars/article/details/22715747,从...原创 2018-11-04 11:00:05 · 146 阅读 · 0 评论 -
Crack LeetCode 之 7. Reverse Integer
https://leetcode.com/problems/reverse-integer/这一题很简单,需要注意检查越界的代码。以下是C++和python的实现。struct Solution { int reverse(int x) { long long sum = 0; for (; x; x = x / 10) { sum = sum * 10 + x % 1...原创 2018-12-08 13:21:20 · 152 阅读 · 0 评论 -
Crack LeetCode 之 9. Palindrome Number
https://leetcode.com/problems/palindrome-number/这一题巧妙运用取余和除法运算来取十进制数字的高位和低位。之前我还想到过把数字转为字符串,然后再检查,但是这样效率比较低。以下为C++的代码和python的代码,时间复杂度是O(n),空间复杂度是O(1)。struct Solution { bool isPalindrome(int x...原创 2018-12-05 16:52:17 · 131 阅读 · 0 评论 -
Crack LeetCode 之 300. Longest Increasing Subsequence
https://leetcode.com/problems/longest-increasing-subsequence/以下为C++和Python解法,时间复杂度是O(n2),空间复杂度是O(n)。本解法需要一个辅助数组nums,数组中的第i个元素表示:由0到第i个元素构成序列的最大升序序列的元素个数,然后再扫描这个数组就得到了结果。struct Solution { int len...原创 2018-12-23 12:02:06 · 147 阅读 · 0 评论 -
Crack LeetCode 之 200. Number of Islands
https://leetcode.com/problems/number-of-islands/本题解法的巧妙之处在于,把含有1的岛合并,这样只要统计1的个数就能知道有多少个岛。另外,本解法直接在传入的gird中保存合并结果,也节约了内存。以下为C++和python的代码,时间复杂度为O(m*n),空间复杂度为O(1)。struct Solution { int numIslan...原创 2018-12-22 17:10:11 · 157 阅读 · 0 评论 -
Crack LeetCode 之 149. Max Points on a Line
https://leetcode.com/problems/max-points-on-a-line/这题代码比较太长不适合面试,解法参考:https://blog.youkuaiyun.com/linhuanmars/article/details/21060933原创 2018-12-11 15:15:47 · 176 阅读 · 0 评论 -
Crack LeetCode 之 15. 3Sum
https://leetcode.com/problems/3sum/3Sum实际上是对2sum的封装。这道题目里会有重复的数,所以2sum使用夹逼的方法求解。算法的时间复杂度是,空间复杂度是O(n)。以下分别为C++和Python实现。struct Solution { vector<vector<int>> threeSum(vector<int>...原创 2018-12-22 12:53:22 · 162 阅读 · 0 评论 -
Crack LeetCode 之 29. Divide Two Integers
https://leetcode.com/problems/divide-two-integers/本题的O(log(n))解法请参考:https://blog.youkuaiyun.com/linhuanmars/article/details/20024907原创 2018-12-10 22:31:51 · 151 阅读 · 0 评论 -
Crack LeetCode 之 50. Pow(x, n)
https://leetcode.com/problems/powx-n/本题可采用二分法+递归解。以下是c++和python的代码。时间复杂度是O(log(n)),空间复杂度是O(log(n))。本题还有一种解法,就是以2为基数进行迭代,可参考:https://blog.youkuaiyun.com/linhuanmars/article/details/20092829struct Solutio...原创 2018-12-10 22:17:39 · 156 阅读 · 0 评论 -
Crack LeetCode 之 69. Sqrt(x)
https://leetcode.com/problems/sqrtx/本题可以采用二分法和牛顿法,以下分别为C++和python实现。struct Solution { int sqrt(int x) { if (x == 0) return 0; double lastY = 0; double y = 1; while (y != lastY) { ...原创 2018-12-09 14:13:20 · 197 阅读 · 0 评论 -
Crack LeetCode 之 1. Two Sum
https://leetcode.com/problems/two-sum/基本思路是做一个hanshmap,然后迭代查询/插入这个hashmap。时间复杂度是O(n),空间复杂度也是O(n)。下文给出了C++和python的代码,python的代码非常简洁,只有7行。struct Solution { vector<int> twoSum(vector<int&...原创 2018-12-14 17:01:09 · 138 阅读 · 0 评论 -
Crack LeetCode 之 99. Recover Binary Search Tree
https://leetcode.com/problems/recover-binary-search-tree/BST的两个节点被调换了位置,如何恢复?我们对BST做中序遍历应该得到一个有序序列,但是节点被调换位置的话,中序遍历就会遇到一个节点的前序节点比该节点大的情况,所以我们可以用中序遍历找到位置错误的节点。节点调换位置有两种情况:一是相邻两个节点被调换;二是不相邻的两个节点被调换。...原创 2018-10-26 18:08:56 · 166 阅读 · 0 评论 -
Crack LeetCode 之 98. Validate Binary Search Tree
https://leetcode.com/problems/validate-binary-search-tree/本题要检查BST是否合法。我们知道对BST做中序遍历会得到一个有序序列,所以我们可以中序遍历BST,对各节点保存前序节点,然后检查各节点是否大于其前序节点即可。以下代码的时间复杂度是O(n),空间复杂度也是O(n)。class Solution { TreeNode...原创 2018-10-25 18:09:11 · 128 阅读 · 0 评论 -
卡特兰数算法题整理
最近我做了很多卡特兰数相关的算法题,阅读了一些网络上的文章。有的文章过于冗长,太纠结于公式的推导;有的文章又太简单,只是罗列了相关的题目却并无解题分析;而且这些文章或多或少都有一些错误。所以本文目的是简明的分析卡特兰数题目的思路和解法,并且整理的网友的注解。以下是两篇本文主要引用的文章的链接:https://blog.youkuaiyun.com/Hackbuteer1/article/details...原创 2018-10-02 18:00:39 · 2052 阅读 · 0 评论 -
Crack LeetCode 之 96. Unique Binary Search Trees
https://leetcode.com/problems/unique-binary-search-trees/description/因为对于任何一个形态只有一种数字排列方式,所以这道题的本质是求可能的二叉查找树的形态总数。具体解法是任选一个节点做根节点,将左右两边可能的二叉树形态的数目相乘得到一个结果数。按照以上方法遍历所有的节点并累加即可。可以采用动态规划的方法,用一个res数组保...原创 2018-10-01 14:06:44 · 181 阅读 · 0 评论 -
Crack LeetCode 之 70. Climbing Stairs
https://leetcode.com/problems/climbing-stairs/description/假设对于n阶楼梯,一共有f种走法。然后分两种情况:1.先迈出一步,对于剩下的n-1阶楼梯一共有f1种走法;2.先迈出两步,对于剩下的n-2阶楼梯一共有f2种走法。那么f=f1+f2。显然这是斐波那契数列的公式,所以这道题实际上是求斐波那契数列。以下是实现代码,时间复杂度...原创 2018-09-16 15:09:40 · 179 阅读 · 0 评论 -
Crack LeetCode 之 50. Pow(x, n)
https://leetcode.com/problems/powx-n/description/本题的思想是二分法,先求n/2次幂,然后两两相乘得到结果;而求n/2次幂,可采用递归迭代的方法。该解法的时间复杂度是O(Log(n)),空间复杂度也是O(Log(n))。以下是实现代码:class Solution {public: double myPow(double x, i...原创 2018-09-16 15:07:08 · 148 阅读 · 0 评论 -
Crack LeetCode 之 31. Next Permutation
Leetcode link: https://leetcode.com/problems/next-permutation/解这道题需要先了解什么是“下一个 排列”的算法,否则单凭题目中给出的几个例子根本无从下手。参考这个链接:https://www.cnblogs.com/ECJTUACM-873284962/p/6390591.html这道题要求不能使用extra memory,所以不...原创 2018-09-03 11:58:23 · 167 阅读 · 0 评论 -
Crack LeetCode 之 621. Task Scheduler
Leetcode link: https://leetcode.com/problems/task-scheduler/description/基本要点:这道题的本质是求冷却矩形的面积。所谓冷却矩形就是由最长任务的长度乘以冷却时间得到的矩形。把所有任务填充这个矩形,如果能填满或者大于矩形面积,就不会有冷却的问题,那么所需的最少interval就是所有任务总长度;否则最少的interval就是...原创 2018-09-02 20:43:22 · 153 阅读 · 0 评论 -
Crack LeetCode 之 152. Maximum Product Subarray
https://leetcode.com/problems/maximum-product-subarray/description/下文除了代码部分外,整理自https://blog.youkuaiyun.com/linhuanmars/article/details/39537283这道题跟https://blog.youkuaiyun.com/tassardge/article/details/830008...原创 2018-10-11 15:49:56 · 134 阅读 · 0 评论 -
Crack LeetCode 之 121. Best Time to Buy and Sell Stock
https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/这道题跟https://blog.youkuaiyun.com/tassardge/article/details/83000873类似,还是用一维动态规划中的“局部最优和全局最优法”。我们迭代处理每天的价格,并且维护三个变量min_price、local和...原创 2018-10-11 16:09:33 · 147 阅读 · 0 评论 -
Crack LeetCode 之 106. Construct Binary Tree from Inorder and Postorder Traversal
https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/本题解法同https://blog.youkuaiyun.com/tassardge/article/details/83378692 故不赘述。C++代码如下,时间复杂度是O(n),空间复杂度是O(n)。class S...原创 2018-10-25 16:24:51 · 171 阅读 · 0 评论 -
Crack LeetCode 之 105. Construct Binary Tree from Preorder and Inorder Traversal
https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/这道题已知中序遍历和前序遍历的结果求二叉树。我们发现中序遍历结果和前序遍历结果的结构如下。中序遍历结果的结构:[左子树中序遍历结果] + 根节点 + [右子树中序遍历结果]前序遍历结果的结构:根节点 + [左子树前...原创 2018-10-25 16:04:09 · 133 阅读 · 0 评论 -
Crack LeetCode 之 109. Convert Sorted List to Binary Search Tree
http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/对一个BST做中序遍历,就得到了一个有序链表;同理,如果按照中序遍历的顺序对有序链表中的节点建立BST,便得到了对应的BST。以下代码用递归的方法以中序遍历的顺序建立BST。C++代码和python代码如下,时间复杂度是O(n),空间复杂度是O...原创 2018-10-25 14:07:23 · 162 阅读 · 0 评论 -
Crack LeetCode 之 123. Best Time to Buy and Sell Stock III
原题链接:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/本文的算法来自这个链接,但是在此基础上做了部分修改:https://blog.youkuaiyun.com/linhuanmars/article/details/23236995本文使用的是二维动态规划,是我们之前讨论的“全局最佳+局部最佳”的扩展。首先,我...原创 2018-10-20 16:17:42 · 144 阅读 · 0 评论 -
Crack LeetCode 之 108. Convert Sorted Array to Binary Search Tree
https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/把有序数组转为二叉查找树,本质上就是对数组做二分查找,中间元素就是根;然后在对左右两个分区迭代二分查找。本题可以用递归函数来解。c++代码和python代码如下,空间复杂度是O(logn),时间复杂度是O(n)。class Solution {...原创 2018-10-22 18:51:10 · 148 阅读 · 0 评论 -
Crack LeetCode 之 53. Maximum Subarray
https://leetcode.com/problems/maximum-subarray/description/下文除了代码以外,部分引用和整理自下文。https://blog.youkuaiyun.com/linhuanmars/article/details/21314059这是一道非常经典的动态规划题,本题的思路在别的动态规划题中也很常用,以后我们称之为“局部最优和全局最优解法”。基本...原创 2018-10-10 17:47:36 · 158 阅读 · 0 评论 -
Crack LeetCode 之 91. Decode Ways
https://leetcode.com/problems/decode-ways/description/本题可以用动态规划解。对于一个字符串s,假设其长度为length,并且有一个长度为(length+1)的int数组statusVec。对于statusVec的任意一个元素statusVec[i],它的含义是前i个数字组成的字符串有多少种解法。当新加进来一个数字的时候,根据该字符与前一...原创 2018-09-22 17:08:44 · 172 阅读 · 0 评论 -
Crack LeetCode 之 122. Best Time to Buy and Sell Stock II
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/由于可以交易无限次,所以最大收益等于所有单调递增区间的累加值。换句话说,只要后一天比前一天的价格高,就可以累加这个增量。以下是C++代码和python代码,时间复杂度为O(n),空间复杂度为O(1)。class Solution {p...原创 2018-10-11 16:42:33 · 124 阅读 · 0 评论 -
ARTS 20190921 algorithm 395. Longest Substring with At Least K Repeating Characters
今天做了一道算法题 https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters/我的C++实现是暴力算法,思路比较简单,O(n2)算法复杂度。我看leetcode里面的讨论,下面这个思路不错,是O(n)算法复杂度。https://leetcode.com/problems/longe...原创 2019-09-21 20:56:22 · 151 阅读 · 0 评论
分享