自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 98. Validate Binary Search Tree

判断是否是BST,需要注意的是你不能只判断root的左儿子小于根节点,根节点小于右儿子,而是需要保证右子树所有的点都要大于根节点,左子树所有的点都小于根节点。所以可以做中序遍历,然后判断遍历所得的数组,是否是递增的。class Solution {public: vector n; bool isValidBST(TreeNode* root) { n.clear(

2017-06-25 20:56:46 169

原创 94. Binary Tree Inorder Traversal 中序遍历

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas

2017-06-25 18:46:16 147

原创 210. Course Schedule II Medium

这道题要求拓扑排序,返回合法的序列,用不停删除入度为0的点的方法做。注意,stack来存储需要处理的入度为0的点,vector sorted存储结果。class Solution {public: vector findOrder(int numCourses, vector >& prerequisites) { int degree[numCourses] = {0};

2017-06-18 13:53:35 173

原创 207. Course Schedule Medium

先修课的安排问题,要判断能不能修完所给的课程,只要看图中有没有环。思路参考上一篇图的文章。AC代码如下。这是用递归判断每一个点开始做DFS是否有环,实际上性能稍差,因为有重复判断的情况,可以加一个数组存储递归的结果,免去重复递归的情况。class Solution {public: bool canFinish(int numCourses, vector >& prereq

2017-06-18 13:48:40 186

原创 判断有向图是否有环

在图论中,如果一个有向图从任意顶点出发无法经过若干条边回到该点,则这个图是一个有向无环图(Directed Acyclic Graph,DAG). 对于一个n个节点的有向图(节点编号从0到n-1),请判断其是否为有向无环图. 图的节点数和边数均不多于100000. 请为下面的Solution类实现解决上述问题的isDAG函数,函数参数中n为图的节点数,edges是边集,edges[i]表示第i条边

2017-06-17 23:09:20 793

原创 611. Valid Triangle Number

这道题跟之前做过的 3Sum 很相似(先排序)。O(n^3)的做法肯定超时,应该先固定一个值,然后用two pointers遍历,这样达到O(n^2)的复杂度。不过这里遇到的问题是,如果你固定最小的值,当右边的left和right构成的三角行,此时不合法,应该怎么处理?这时既可以左移right,又可以右移left,但这两种情况都要考虑,因为这种操作都可能使三角形合法。这样就很难处理。答案中有简

2017-06-11 23:06:11 150

原创 617. Merge Two Binary Trees Easy

这题要求合并两个二叉树,相同位置的节点数值相加,如果有不存在的情况,采用存在的那个子树。主要思想:采用递归,两个子树同时遍历,从某一根节点开始,先考虑根。我们直接在第一个子树上修改。如果第二个子树为空,什么都不做。如果第一个为空,第二个不空,直接采用第二个子树。如果都不空,把根处的值相加,然后递归的处理左子树和右子树。细节:递归的函数需要指针加引用class Solut

2017-06-11 11:31:44 141

原创 64. Minimum Path Sum Medium

求到达右下角的路径,使得路径上数的和最小。比较简单。每一个位置你选择从上面来更小还是左边来更小就好。class Solution {public: int minPathSum(vector>& grid) { int m = grid.size(), n = grid[0].size(); int d[m][n]; for (int

2017-06-09 16:51:18 259

原创 63. Unique Paths II Medium

接上一题Unique Paths,这里增加了有障碍的情况。其实也很好理解。对于数组中不是边界的情况,原本d[i][j]等于来自上方和左边两个的和,如果上面是障碍,则从上面来的路径数为0,左边类似。不同的是,边界中原本路径数为1,如果边界中有障碍,障碍后面的都为0。需要注意的是,存在起点有障碍和终点有障碍的情况。class Solution {public: int uniquePat

2017-06-09 16:33:23 135

原创 62. Unique Paths Medium

要求从左上角走到右下角的不同的路径数。主要思想:d[i][j]表示走到表格中(i, j)的路径数,下标从0开始。则有d[i][j] = d[i - 1][j] + d[i][j - 1]。class Solution {public: int uniquePaths(int m, int n) { int d[m][n]; for(int i =

2017-06-03 17:55:29 156

原创 374. Guess Number Higher or Lower Easy

这道题是二分查找的使用。需要注意的是,求mid不可以用(right + left)/ 2,因为可能会越界,超过int的最大值,应该用(right - left)/ 2 + left。// Forward declaration of guess API.// @param num, your guess// @return -1 if my number is lower, 1 if my

2017-06-03 16:32:15 169

原创 494. Target Sum Medium

这道题按如下推导,把它转化成求是否存在子集的和为特定值。跟416. Partition Equal Subset Sum一样的做法。这里给出一维数组的简化版。这题的坑在于,要判断数组的和是否大于s,如果小于s,直接返回0,样例中有s=1000000000的情况,很坑爹sum(P) - sum(N) = targetsum(P) + sum(N) + sum(P) -

2017-06-01 20:09:42 176

原创 416. Partition Equal Subset Sum Medium

这道题要求把一组数分成相等的两部分,实际上是求数组中是否有子集等于特定值(这里特定值为所有数和的一半)。那么考虑子问题,数组中是否有子集等于target。我们用动态规划。主要思想:对于数组中的每个数,我们有取或不取两种选择,实际上是背包问题。设d[i][j]表示前i个数和为j的方案数,所以有状态转移方程:d[i][j] = d[i - 1][j] + d[i - 1][j

2017-06-01 17:46:15 294

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除