revoir
码龄14年
关注
提问 私信
  • 博客:6,700
    6,700
    总访问量
  • 24
    原创
  • 1,847,898
    排名
  • 0
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:美国
  • 加入CSDN时间: 2011-04-26
博客简介:

revoir的专栏

查看详细资料
个人成就
  • 获得0次点赞
  • 内容获得0次评论
  • 获得2次收藏
创作历程
  • 24篇
    2016年
成就勋章
TA的专栏
  • 圆渣的刷题博客
    21篇
创作活动更多

仓颉编程语言体验有奖征文

仓颉编程语言官网已上线,提供版本下载、在线运行、文档体验等功能。为鼓励更多开发者探索仓颉编程语言,现诚邀各位开发者通过官网在线体验/下载使用,参与仓颉体验有奖征文活动。

368人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

371. Sum of Two Integers

这是一道比特运算题。我们先假设a 和b两个数都为自然数,那么这道题就可以看成是连个字符串相加 Add Two Numbers 的延伸题,很简单了。但是记住,一定不要对任何对结果有影响的数数进行开头或者结尾补零,因为正数和负数在表达方式上是不一样的。class Solution {public: int getSum(int a, int b) {
原创
发布博客 2016.07.18 ·
284 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
251 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

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 ·
358 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

98. Validate Binary Search Tree 和延伸

首先来说最简单的解法。因为要验证的树是BST,那个当我们pre-order遍历的时候,得到的结果将会是一个升序数组。所以每访问到一节点,我们只用判断当前节点是不是大于上一个访问的节点的值就可以了。需要注意的是,如果维护一个vector保存所有之前访问过的节点的值,那么只用int类型
原创
发布博客 2016.06.20 ·
298 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
294 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
211 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
281 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
203 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

224. Basic Calculator

这道题最traverse的解法就是,对于位于i的符号,计算在他前面的结果。如果遇到(,那么就保护现场,刷新临时变量开始下一个计算。遇见)说明当前小节结束,merge当前的临时变量和stack最顶端保留的计算符号和结果。代码条路清晰,结构冗余。int calculate(string s) { stack memo; int res = 0;
原创
发布博客 2016.04.28 ·
272 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
184 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
201 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

63. Unique Paths II

解法和unique path 1极其相似,多了几个边界条件。坑:1. 有block的时候需要初始化。在初始化的过程中,遇到一个block后面去安为0.2. 初始化第一行的时候要单独做,初始获第一列的时候可以再for循环嵌套中作 3. 一开始的返回条件要包含第一个格子就是墙的情况int uniquePathsWithObstacles(vector>& obstacleGrid)
原创
发布博客 2016.04.25 ·
358 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

62. Unique Paths

这道题是二维的上楼梯。也是非常典型的dp题。最规整的解法就是新建一个二维数组,初始化第一行第一列为1,然后任意一个空格就是他左边和上边的值的和。有一个小点的注意,如果初始化memo数组为1.可以省去一些步骤。另外注意不要吃书画的时候神使鬼差memo[i][0]=iint uniquePaths(int m, int n) {        vector > memo(n,vecto
原创
发布博客 2016.04.25 ·
230 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

57. Insert Interval

这道题有三种解法,其中两种跟上一题,merge interval有些相似。1.直接把新的区间接在区间列表的后面,然后sort,merge interval。这么简单就不贴代码了。2. 从前往后遍历已知的区间集合,当找到第一个起始位置大于要插入区间起始位置的元素的时候,插入新的区间。然后按照merge interval的方法改变上一个插入的区间,或者插入新的区间。这个做法徐杰实现有挺
原创
发布博客 2016.04.22 ·
289 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

56. Merge Intervals

之前编辑了半天为什么不见了。。。这道题其实想法挺简单的,就是先对数组排序,然后从头开始遍历。对任意一个区间,从当前点开始,一个一个比较自身和后面的区间有没有交集,更新当前区间。一开始我的想法是inplace的实现,看似时间复杂度O(n),常熟空间复杂度,一看大家都是跟我方法基本一样,但是还要新建一个res数组,我心里觉得特别美。。 vector merge(vector& pairs)
原创
发布博客 2016.04.21 ·
290 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
314 阅读 ·
0 点赞 ·
0 评论 ·
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 ·
258 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

152. Maximum Product Subarray

这是一道典型DP题。遍历一遍数组的同时,比较当前最大值和历史最大值。最终返回历史最大值。不过值得注意的一点是,因为负负得正所以如果当前值是负数,那么乘以之前的当前负数最小值就是当前最大值。小坑:初始化的时候,当前最大最小值赋予1,就可以从第一个元素开始遍历了。如果赋予nums[0]就需要从第一个元素遍历,for循环写起来稍微麻烦一些大坑:如果同时更改cur_max 和cur_min,并且计
原创
发布博客 2016.04.18 ·
216 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

58. Length of Last Word

这道题乍一看很简单,其实还是得稍微有一点点弯弯绕的。主要是边界条件特殊的case比较多。需要注意到几点:1. leading space2. tailing space3. 整个string全是空格4. 单词之前好多空格第一种解法是从前向后扫一遍,没遇到一个空格,记录下位置再继续找下一个空格知道字符串结束。这种方法需要去掉leadig/tailing空格。写起来有一点点繁琐
原创
发布博客 2016.04.18 ·
190 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

282. Expression Add Operators

这道题基本属于典型无脑dfs,跟word break有一点点的类似,都是给一个长串字母然后进行分割。但是要注意的是如果要添加乘法运算符,需要先减去上一个添加的值然后再添加当前新的值和上一个值的乘积。看了一下基本网上所有人都是这个解法,不知道lc那些400ms以内的人怎么做的。。这道题有几个药注意的点1. 持续追踪上次一运算用的值。在迭代的时候替换为当前值,记得根据当前运算符
原创
发布博客 2016.04.16 ·
575 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏
加载更多