- 博客(24)
- 资源 (4)
- 收藏
- 关注
原创 371. Sum of Two Integers
这是一道比特运算题。 我们先假设a 和b两个数都为自然数,那么这道题就可以看成是连个字符串相加 Add Two Numbers 的延伸题,很简单了。 但是记住,一定不要对任何对结果有影响的数数进行开头或者结尾补零,因为正数和负数在表达方式上是不一样的。 class Solution { public: int getSum(int a, int b) {
2016-07-18 01:01:04 278
原创 357. Count Numbers with Unique Digits
这道题乏善可陈。最基本的dfs 和高中概率题 解法一:dfs int countNumbersWithUniqueDigits(int n) { unordered_set used; int res=1; helper(res, used, n); return res; } void helper(i
2016-06-24 14:06:16 247
原创 333. Largest BST Subtree
这道题是 98. Validate Binary Search Tree 的进阶。最好先想到的方法就是对于每一个subtree判断他是不是valid BST,如果是的话计算size。 这样的解法问题就在于,时间复杂度太高了。 class Solution_largest_BST_simple{ public: int largest (TreeNode* root){
2016-06-21 02:16:39 353
原创 98. Validate Binary Search Tree 和延伸
首先来说最简单的解法。因为要验证的树是BST,那个当我们pre-order遍历的时候,得到的结果将会是一个升序数组。所以每访问到一节点,我们只用判断当前节点是不是大于上一个访问的节点的值就可以了。 需要注意的是,如果维护一个vector保存所有之前访问过的节点的值,那么只用int类型
2016-06-20 11:45:01 292
原创 206, 92, 65. Reverse Linked List 系列
Reverse Linked List是典型的链表头插法的实例。头插法比较简单易懂,条理清晰,是做很多linked list题目的关键。首先用最简单的Reverse Linked List这道题举例,简单说明一下什么是头插法。 class Solution { public: ListNode* reverseList(ListNode* head) { if(hea
2016-06-04 11:34:00 290
原创 96. Unique Binary Search Trees
很容易想到迭代的方法去做。我自己感觉这个迭代有一点点dc的意思在里面。 int numTrees(int n) { if(n<=1) return 1; int res=0; for(int i=0;i<n;++i){ res+=numTrees(i)*numTrees(n-1-i);
2016-05-01 15:00:59 209
原创 150. Evaluate Reverse Polish Notation
int evalRPN(vector& tokens) { vector memo; int res=0; for(auto i:tokens){ int temp=0; if(i=="+"||i=="-"||i=="*"||i=="/"){ int second = m
2016-04-30 15:41:04 279
原创 227. Basic Calculator 2
这道题和 282. Expression Add Operators(http://blog.csdn.net/revoir/article/details/51167848) 非常相似。把相乘和相除集体看成一个计算单元,加减分隔开的计算单元一个个的放到memo里面。这个方法要过两遍。 int calculate(string s) { vector memo;
2016-04-29 14:43:21 199
原创 224. Basic Calculator
这道题最traverse的解法就是,对于位于i的符号,计算在他前面的结果。如果遇到(,那么就保护现场,刷新临时变量开始下一个计算。遇见)说明当前小节结束,merge当前的临时变量和stack最顶端保留的计算符号和结果。 代码条路清晰,结构冗余。 int calculate(string s) { stack memo; int res = 0;
2016-04-28 13:42:13 268
原创 174. Dungeon Game
这是path sum,机器人走迷宫系列的一道hard 新题。难点在于当前格子的血量计算有好几种情况,实现起来有些复杂。 1. 当前空格是血瓶,那么所需血量就是前面一个格子需要的血量减去血瓶的补给。如果血瓶的补给多余需要的,当前所需血量变为1。 memo[i][j]=max(1, pre-map[i][j]) map[i][j]>=0 2. 当前空格是敌人,所需血量就是前面格子减去打怪兽要
2016-04-27 06:41:28 181
原创 64. Minimum Path Sum
这道题的解法和unipue path1一模一样。就不多说了。 int minPathSum(vector>& grid) { if(grid.size()==0) return INT_MAX; int m=grid.size(); int n=grid[0].size(); vector memo(n,grid[0][0]);
2016-04-25 13:11:32 197
原创 63. Unique Paths II
解法和unique path 1极其相似,多了几个边界条件。 坑: 1. 有block的时候需要初始化。在初始化的过程中,遇到一个block后面去安为0. 2. 初始化第一行的时候要单独做,初始获第一列的时候可以再for循环嵌套中作 3. 一开始的返回条件要包含第一个格子就是墙的情况 int uniquePathsWithObstacles(vector>& obstacleGrid)
2016-04-25 12:54:56 356
原创 62. Unique Paths
这道题是二维的上楼梯。也是非常典型的dp题。 最规整的解法就是新建一个二维数组,初始化第一行第一列为1,然后任意一个空格就是他左边和上边的值的和。 有一个小点的注意,如果初始化memo数组为1.可以省去一些步骤。另外注意不要吃书画的时候神使鬼差memo[i][0]=i int uniquePaths(int m, int n) { vector > memo(n,vecto
2016-04-25 12:31:41 227
原创 57. Insert Interval
这道题有三种解法,其中两种跟上一题,merge interval有些相似。 1.直接把新的区间接在区间列表的后面,然后sort,merge interval。这么简单就不贴代码了。 2. 从前往后遍历已知的区间集合,当找到第一个起始位置大于要插入区间起始位置的元素的时候,插入新的区间。然后按照merge interval的方法改变上一个插入的区间,或者插入新的区间。这个做法徐杰实现有挺
2016-04-22 15:21:47 285
原创 56. Merge Intervals
之前编辑了半天为什么不见了。。。 这道题其实想法挺简单的,就是先对数组排序,然后从头开始遍历。对任意一个区间,从当前点开始,一个一个比较自身和后面的区间有没有交集,更新当前区间。 一开始我的想法是inplace的实现,看似时间复杂度O(n),常熟空间复杂度,一看大家都是跟我方法基本一样,但是还要新建一个res数组,我心里觉得特别美。。 vector merge(vector& pairs)
2016-04-21 07:47:39 288
原创 50. Pow(x, n)
今天偷懒选到简单题写。 这是一道典型的简单的二分法的题。先判断边界条件,然后进行“分”,然后在合并。 坑, 主要都是边界条件: 注意INT_MIN,0,1,负数幂 class Solution { public: double myPow(double x, int n) { if(n==0) return 1; if(n==
2016-04-19 14:28:56 310
原创 284. Peeking Iterator
感觉这道题主要考OOD和cpp的语法 坑: 1.怎么在派生类里面调用基类的非虚函数 2.hasnext()不能直接调用基类的hasnext(),因为如果peak了之后,基类的next已经往后移动了 // Below is the interface for Iterator, which is already defined for you. // **DO NOT** modify th
2016-04-19 13:59:34 252
原创 152. Maximum Product Subarray
这是一道典型DP题。遍历一遍数组的同时,比较当前最大值和历史最大值。最终返回历史最大值。不过值得注意的一点是,因为负负得正所以如果当前值是负数,那么乘以之前的当前负数最小值就是当前最大值。 小坑:初始化的时候,当前最大最小值赋予1,就可以从第一个元素开始遍历了。如果赋予nums[0]就需要从第一个元素遍历,for循环写起来稍微麻烦一些 大坑:如果同时更改cur_max 和cur_min,并且计
2016-04-18 05:56:28 212
原创 58. Length of Last Word
这道题乍一看很简单,其实还是得稍微有一点点弯弯绕的。主要是边界条件特殊的case比较多。 需要注意到几点: 1. leading space 2. tailing space 3. 整个string全是空格 4. 单词之前好多空格 第一种解法是从前向后扫一遍,没遇到一个空格,记录下位置再继续找下一个空格知道字符串结束。这种方法需要去掉leadig/tailing空格。写起来有一点点繁琐
2016-04-18 05:28:53 188
原创 282. Expression Add Operators
这道题基本属于典型无脑dfs,跟word break有一点点的类似,都是给一个长串字母然后进行分割。 但是要注意的是如果要添加乘法运算符,需要先减去上一个添加的值然后再添加当前新的值和上一个值的乘积。 看了一下基本网上所有人都是这个解法,不知道lc那些400ms以内的人怎么做的。。 这道题有几个药注意的点 1. 持续追踪上次一运算用的值。在迭代的时候替换为当前值,记得根据当前运算符
2016-04-16 14:05:54 568
原创 241. Different Ways to Add Parentheses
题干: Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +,- and *. Example 1
2016-04-15 13:53:16 255
原创 70. Climbing Stairs
这是一道hello word难度的的DP题, 有点像斐波那契额数列。 当前台阶的步数=上一个台阶的步数+上上个台阶的步数。由于只需要前两个变量,所以不需要记录整个过程。 O(n)+O(1)解法: class Solution { public: int climbStairs(int n) { if(n<=1) return 1;
2016-04-14 13:25:12 223
原创 148. Sort List
题目: Sort a linked list in O(n log n) time using constant space complexity. 这道题是一道中等难度的题,实现稍微有一点点复杂。算法很简答就是merge sort。 1. 我的未优化代码和一丢丢优化 class Solution { public: ListNode* sortList(ListNode*
2016-04-13 14:38:21 282
原创 圆渣的刷题博客
gg加面gg之后,再次得到feedback说good algorithm,bad coding。之前断断续续的刷题确实不行。已经浪费两年了,这次怎么着也得狠刷一年,明年一月再战。 下定决心 不怕牺牲 排除万难 争取胜利 = = 但是希望也不要牺牲。。。。
2016-04-13 13:47:37 368
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人