
LeetCode
文章平均质量分 70
HIT_haoran
合抱之木;生于毫末;九层之台;起于累土;千里之行;始于足下
展开
-
{leetCode}2。addTwoNum
链表的题,考研的时候复习过。注意的点:链表长度不同、长度相同但最后一位有进位。不会的点:如何尾插?再看看数据结构。new和Malloc的区别? int r=0,cur; ListNode *l,*tail; //l->next = Null; //tail->next = Nulll;原创 2016-03-19 21:42:47 · 553 阅读 · 0 评论 -
LeetCode Maximal rectangle
动态规划。我自己第一遍做没做出来,上网搜了一下答案,发现是用的之前合并方块的思路做得。就是这样。每次统计每行累计1的个数,然后计算出每行的最大直方图面积。那么代码是如下所示:public class Solution { public int maximalRectangle(char[][] matrix) {if(matrix==null || matrix.length原创 2016-08-10 20:17:00 · 275 阅读 · 0 评论 -
leetcode scramble string
这个题比较难。如果使用动态规划不是太好理解。我做了第一遍没有思路,直接找的答案。是这样的。我们可以把问题分解成简单的问题来看:1、如果S1和S2的大小均为1,结果是两个串的相同比较。2、如果S1和S2的大小为2,那么互相交换,看下是否是相同。那么问题推广为大小为n的话,我们把S1分成A1、A2,S2分成B1 B2。我们只需要递归来看{A1,A2}与{B1,B2}两个部分是否原创 2016-08-10 20:21:54 · 415 阅读 · 0 评论 -
LeetCode 95. Unique Binary Search Trees II
这道题是一道关于Tree的题目。但是表示把所有情况的放入到一个vector里,我是真的没想好怎么搞。于是找了一个答案,豁然开朗。把所有左右子树,放入到一个vector里。最后把根节点放入到一个vector,是vector递归的递归。思路很巧妙。如何处理二叉搜索树,对于子树也满足左子树小于根节点,右子树也大于根节点,这个很简单。只要start小于end就要,不是得就剪枝掉。代码如下:原创 2016-08-10 20:29:48 · 283 阅读 · 0 评论 -
LeetCode Validate Binary Search Tree
这个题挺好的。考察了中序遍历。用中序遍历就可以不用考虑子树的问题。中序遍历后查看数组是否递增就可以了。我第一遍做没有想到。以为是直接深搜,然后就卡在子树问题上了。。class Solution {public: void judge(TreeNode* root,vector&p) { if(!root)return; judge(原创 2016-08-10 20:46:22 · 267 阅读 · 0 评论 -
LeetCode 330. Patching Array
贪心的题目,具体怎么贪心就有说道了。题目的要求是是对一个数组增加一个补丁,使得增加后的数组可以加和表示所有从1到n的数。我们可以知道如果一个数比之前的几个累加和还要大的话,说明这个数不能由前几个数来表示。所以根据这个知识,我们可以定义一个累加和变量,专门来记录累加和。比如说例子中的1,5,10,我们定义初始的累加和是1,因为从1开始嘛。1+1=2算法就和上述说的是一样的。cla原创 2016-08-12 19:39:50 · 253 阅读 · 0 评论 -
LeetCode 135. Candy
这个题目难度很小,也是一道贪心的题目。怎么贪呢?就按照题目要求来,可是遇到这个问题怎么办:后一个比前一个小,但是后一个却是一个大于它之后数的。这个会导致选择困难,你没法选出一个优解。我的解决办法是,排序,然后对排序后的序列的索引一个一个找周围的贪心解。这样就可以很好的,解决这个问题。其实还有一种更简单的办法,就是前向,找前一个比后一个大的计算好数组后,在后向找后一个比前一个大的。就可以了。我的代码原创 2016-08-12 19:49:58 · 332 阅读 · 0 评论 -
LeetCode 44. Wildcard Matching
同样是一道贪心的题目。但是我首次写的代码是用的回溯,结果超时了。问题可能就出在这个回溯上。所以就写了一个数组表示的。AC。class Solution {public: bool isMatch(string s, string p) { int presp,press; bool flag = false; int i,j;原创 2016-08-12 19:53:48 · 255 阅读 · 0 评论 -
LeetCode 106 Construct Binary Tree from Inorder and Postorder Traversal
这个是一道深度优先搜索的题目。我们如何处理中序遍历和后序遍历的数组,使其能够表示成一颗二叉搜索树呢?我是这样处理的。首先,我们知道后序遍历的数组。从后到前是树根-子树根-子子树根,好了,有了这个递归的顺序我们就可以执行了。首先取出树根节点,在中序遍历的数组中寻找这个节点所在的位置,那么这个位置的左侧就是左子树,右侧是右子树。根据这个道理再递归求解就可以了。唯一需要注意的是开始和原创 2016-08-12 19:56:28 · 450 阅读 · 0 评论 -
LeetCode 99. Recover Binary Search Tree
首先想到的是,中序遍历,然后把数组的内容再赋值给原来的树。题目还给了一种问题,如果使用O(1)空间复杂度该怎么做。。。。这个没考虑出来class Solution {public: int c; void Inorder(TreeNode* root,vector &r) { if(!root)return ; Inorder(ro原创 2016-08-12 20:06:27 · 234 阅读 · 0 评论 -
LeetCode 45. Jump Game II
贪心的题目。使用的每次找自己周围最大可达范围,如果最大可达范围是自身,那就跳到最大可达的位置,如果不是,就跳到最大的位置。class Solution {public: int jump(vector& nums) { int len = nums.size(); if(len==1)return 0; int footstep=0,原创 2016-08-13 22:00:20 · 287 阅读 · 0 评论 -
LeetCode 100 Same Tree
很简单的深搜。代码写得我很得意。用到了之前学的一些东西。class Solution {public: bool isSameTree(TreeNode* p, TreeNode* q) { if(!p||!q) return !p&&!q; if(p->val!=q->val) {原创 2016-08-08 21:25:46 · 236 阅读 · 0 评论 -
LeetCode 96 Unique Binary Search Trees
这道题很简单是catalan数,只要知道catalan数的递推公式就可以了。class Solution {public: long long numTrees(int n) { long long *h = new long long[n+1]; h[0]=1;h[1]=1; for(int i=2;i<=n;i++)原创 2016-08-08 21:23:59 · 223 阅读 · 0 评论 -
{Leetcode} 1。TwoSum
打算找工作了。把leetCode的题集刷一刷。第一个题很简单,但是做出来比较麻烦,出错的地方比较多。思路:2分查找。不会的知识点:C++ 的 模板函数。回来打算把C++Primer 刷一遍。都搞清楚。我把自己的写好的代码贴上来。(竟然28ms是很慢的。。。。。) multimap::iterator head,last,it; vector::iterator jt;原创 2016-03-19 21:36:59 · 672 阅读 · 0 评论 -
LeetCode10 Regular Expression Matching
说是动态规划,实际上是一道回溯暴力搜索。注意一点就可以了。*的数量可以是0、1、2、3、4.我们只要遍历出当*是0的时候,后续的组合是不是符合要求的。这样我们才可以满足1之后的情形bool isMatch(char* s, char* p) { if (s == NULL || p == NULL) return false; if (*p == '\0') ret原创 2016-08-03 21:09:32 · 512 阅读 · 0 评论 -
leetcode 32 Longest Valid Parentheses
这是一道纯粹的动态规划题目。我之前考虑成了二维dp了。dp方程是如果前一个的括号是‘(’,那么如果j=i+1+dp[i+1]步之后的括号是‘)’那么dp[i]=dp[i+1]+2;同时别忘了考虑到并列的这种情形,所以要加上dp[i]+=dp[j+1];代码如下: int longestValidParentheses(string s) { int len =原创 2016-08-03 21:14:00 · 294 阅读 · 0 评论 -
LeetCode 63. Unique Paths II
这个是一道递推题目,之所以归结到动态规划标签里,是因为递归和动态规划有着很大的联系性。这里要注意两点:1、把障碍的地方设置为02、当障碍在最左边和最上边时,左边和上边的数组一律置为0代码如下: int uniquePathsWithObstacles(vector>& obstacleGrid) { int m = obstacleGrid.size(),n =原创 2016-08-03 21:15:56 · 269 阅读 · 0 评论 -
leetcode SQL题目 177. Nth Highest Salary
MYSQL有一个很有用的函数LIMIT 是指挑选出第N个开始,共M个元素。所以根据这个函数可以得到:这里要注意,SQL声明变量是在Begin之后。DECLARE是声明,SET是赋值CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INTBEGIN DECLARE M INT; SET M=N-1; R原创 2016-08-03 21:19:30 · 395 阅读 · 0 评论 -
LEETCODE SQL题目 180. Consecutive Numbers
这个题目有个小技巧,就是使用了SQL里的用户自定义函数@同时有个很值得注意的点是,()后加name命名用户自定义视图。SELECT DISTINCT Num AS ConsecutiveNums FROM ( SELECT Num, COUNT(Rank) AS Cnt FROM ( SELECT Num, @curRank := @curRank + IF原创 2016-08-03 21:22:22 · 431 阅读 · 0 评论 -
LeetCode 69. Sqrt(x)
二分法求开方,比较简单,如果找到更加快速的方法就更好了。有如下几种,迭代牛顿法、另外一种有cramack提出的办法。这里只列出我的二分法,其他方法我专门找一次总结。 int fun(int c,int x) { if(x/c==c)return 0; return (x/c)>c?-1:1; } int mySqrt(int x原创 2016-08-15 18:49:21 · 350 阅读 · 0 评论 -
leetCode 149. Max Points on a Line
很简单,看线段的斜率就可以了。/** * Definition for a point. * struct Point { * int x; * int y; * Point() : x(0), y(0) {} * Point(int a, int b) : x(a), y(b) {} * }; */class Solution {publi原创 2016-08-15 18:53:19 · 356 阅读 · 0 评论 -
148 Sort List
模板题。这个题的要求是让我们找出一种时间复杂度是O(nlog(n)),空间复杂度是常数级的。这个就可以这么办,使用slow-fast技术将链表分成两部分,所谓slow-fast技术是指,快指针走两个,慢指针走一个,当快指针到头了,慢指针恰好指向中心。这样我们就不需要额外的空间了。代码如下:class Solution {public: ListNode *sortList(Lis原创 2016-08-15 18:54:55 · 486 阅读 · 0 评论 -
LeetCode 72 Edit Distance
我写了两种方案的。一种是用的递归方式,结果超时了。一种是直接用数组模拟删、替换、插入操作。删操作对应的是DP[i][j-1],替换操作对应的是DP[i-1][j-1],插入操作对应额的是DP[i-1][j].此外要注意初始化的情形,如果word1是0,那么对应的最小步骤是word2的长度;如果word2是0,那么对应的最小步骤是word1的长度。OK。解法一:超时的那种。。。。class原创 2016-08-08 21:18:40 · 305 阅读 · 0 评论 -
LeetCode 108. Convert Sorted Array to Binary Search Tree
二叉搜索树的建立是从两边来的。所以分左右递归来建立。代码如下:class Solution {public: TreeNode* generateBST(int left, int right, vector& num) { if (left > right) return nullptr; else if (left原创 2016-08-13 22:05:03 · 293 阅读 · 0 评论