![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
圆渣的刷题博客
文章平均质量分 72
revoir
这个作者很懒,什么都没留下…
展开
-
62. Unique Paths
这道题是二维的上楼梯。也是非常典型的dp题。最规整的解法就是新建一个二维数组,初始化第一行第一列为1,然后任意一个空格就是他左边和上边的值的和。有一个小点的注意,如果初始化memo数组为1.可以省去一些步骤。另外注意不要吃书画的时候神使鬼差memo[i][0]=iint uniquePaths(int m, int n) { vector > memo(n,vecto原创 2016-04-25 12:31:41 · 219 阅读 · 0 评论 -
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 · 193 阅读 · 0 评论 -
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 · 198 阅读 · 0 评论 -
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 · 272 阅读 · 0 评论 -
56. Merge Intervals
之前编辑了半天为什么不见了。。。这道题其实想法挺简单的,就是先对数组排序,然后从头开始遍历。对任意一个区间,从当前点开始,一个一个比较自身和后面的区间有没有交集,更新当前区间。一开始我的想法是inplace的实现,看似时间复杂度O(n),常熟空间复杂度,一看大家都是跟我方法基本一样,但是还要新建一个res数组,我心里觉得特别美。。 vector merge(vector& pairs)原创 2016-04-21 07:47:39 · 280 阅读 · 0 评论 -
57. Insert Interval
这道题有三种解法,其中两种跟上一题,merge interval有些相似。1.直接把新的区间接在区间列表的后面,然后sort,merge interval。这么简单就不贴代码了。2. 从前往后遍历已知的区间集合,当找到第一个起始位置大于要插入区间起始位置的元素的时候,插入新的区间。然后按照merge interval的方法改变上一个插入的区间,或者插入新的区间。这个做法徐杰实现有挺原创 2016-04-22 15:21:47 · 275 阅读 · 0 评论 -
357. Count Numbers with Unique Digits
这道题乏善可陈。最基本的dfs 和高中概率题解法一:dfsint countNumbersWithUniqueDigits(int n) { unordered_set used; int res=1; helper(res, used, n); return res; } void helper(i原创 2016-06-24 14:06:16 · 239 阅读 · 0 评论 -
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 · 280 阅读 · 0 评论 -
98. Validate Binary Search Tree 和延伸
首先来说最简单的解法。因为要验证的树是BST,那个当我们pre-order遍历的时候,得到的结果将会是一个升序数组。所以每访问到一节点,我们只用判断当前节点是不是大于上一个访问的节点的值就可以了。需要注意的是,如果维护一个vector保存所有之前访问过的节点的值,那么只用int类型原创 2016-06-20 11:45:01 · 274 阅读 · 0 评论 -
224. Basic Calculator
这道题最traverse的解法就是,对于位于i的符号,计算在他前面的结果。如果遇到(,那么就保护现场,刷新临时变量开始下一个计算。遇见)说明当前小节结束,merge当前的临时变量和stack最顶端保留的计算符号和结果。代码条路清晰,结构冗余。int calculate(string s) { stack memo; int res = 0;原创 2016-04-28 13:42:13 · 257 阅读 · 0 评论 -
58. Length of Last Word
这道题乍一看很简单,其实还是得稍微有一点点弯弯绕的。主要是边界条件特殊的case比较多。需要注意到几点:1. leading space2. tailing space3. 整个string全是空格4. 单词之前好多空格第一种解法是从前向后扫一遍,没遇到一个空格,记录下位置再继续找下一个空格知道字符串结束。这种方法需要去掉leadig/tailing空格。写起来有一点点繁琐原创 2016-04-18 05:28:53 · 178 阅读 · 0 评论 -
152. Maximum Product Subarray
这是一道典型DP题。遍历一遍数组的同时,比较当前最大值和历史最大值。最终返回历史最大值。不过值得注意的一点是,因为负负得正所以如果当前值是负数,那么乘以之前的当前负数最小值就是当前最大值。小坑:初始化的时候,当前最大最小值赋予1,就可以从第一个元素开始遍历了。如果赋予nums[0]就需要从第一个元素遍历,for循环写起来稍微麻烦一些大坑:如果同时更改cur_max 和cur_min,并且计原创 2016-04-18 05:56:28 · 204 阅读 · 0 评论 -
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 · 189 阅读 · 0 评论 -
63. Unique Paths II
解法和unique path 1极其相似,多了几个边界条件。坑:1. 有block的时候需要初始化。在初始化的过程中,遇到一个block后面去安为0.2. 初始化第一行的时候要单独做,初始获第一列的时候可以再for循环嵌套中作 3. 一开始的返回条件要包含第一个格子就是墙的情况int uniquePathsWithObstacles(vector>& obstacleGrid)原创 2016-04-25 12:54:56 · 346 阅读 · 0 评论 -
174. Dungeon Game
这是path sum,机器人走迷宫系列的一道hard 新题。难点在于当前格子的血量计算有好几种情况,实现起来有些复杂。1. 当前空格是血瓶,那么所需血量就是前面一个格子需要的血量减去血瓶的补给。如果血瓶的补给多余需要的,当前所需血量变为1。memo[i][j]=max(1, pre-map[i][j]) map[i][j]>=02. 当前空格是敌人,所需血量就是前面格子减去打怪兽要原创 2016-04-27 06:41:28 · 171 阅读 · 0 评论 -
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 · 213 阅读 · 0 评论 -
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 · 274 阅读 · 0 评论 -
圆渣的刷题博客
gg加面gg之后,再次得到feedback说good algorithm,bad coding。之前断断续续的刷题确实不行。已经浪费两年了,这次怎么着也得狠刷一年,明年一月再战。下定决心 不怕牺牲 排除万难 争取胜利 = =但是希望也不要牺牲。。。。原创 2016-04-13 13:47:37 · 351 阅读 · 0 评论 -
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 · 299 阅读 · 0 评论 -
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 · 242 阅读 · 0 评论 -
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 · 270 阅读 · 0 评论