![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
文章平均质量分 54
Mr_Giraffe
轻轻松松走在超神的路上
展开
-
leetcode第一刷_Submission Details
有段时间没更新了,专心刷了几天,差十几道结束,决定把第一季更完,然后按照我的理解分类再分析一遍,第二遍的时候应该会按照问题分类,应该会引用第一季的,如果想到或找到更好的解法,会更新第一季。链表的问题就是恶心,思路大多直接,对指针的操作要非常小心。我自己常犯的错误主要有:1. 在取val或者取next时,没有判空,造成Runtime Error。2. 空指针和只有一个节点之类的边界情况。原创 2014-05-04 21:09:50 · 2285 阅读 · 11 评论 -
leetcode第一刷_Linked List Cycle
这道题不要太有名啊,有没有公司不问这道题?原创 2014-05-04 21:14:51 · 1066 阅读 · 0 评论 -
leetcode第一刷_Linked List Cycle II
这道题稍微有点意思,知道答案发现,呀,这么简单就能做啊。我一开始想的是,相遇之后用另一个指针怎么走,然后满足什么关系之后能推出来,其实不用这么麻烦。是很简单的数学关系,我画个图说一下。S1代表的是链表进入环之前的长度,a代表当两个指针相遇时,走一步的指针在环里走的长度,S2代表的是环的周长,那么根据条件,相遇时,走两步的指针走的距离是走一步的两倍,我们得到公式:(S1+a)*2 =原创 2014-05-04 21:36:46 · 1272 阅读 · 0 评论 -
leetcode第一刷_Word Break II
有了上个题铺垫,这个题的思路就非常简单了,原创 2014-05-04 22:09:25 · 1200 阅读 · 0 评论 -
leetcode第一刷_Single Number II
其他出现两次,只有一个出现一次的那道题我就不更了,直接抑或,最后的结果就是那个数。为什么可以这样做呢?因为一个32位int,如果所有数都出现了两次,那么为1的那些位统计的个数一定是2的倍数,抑或之后全变成0。一个数出现了一次,它为1的那些位上,1的个数必定是奇数,抑或之后一定还是1。我之前知道出现两次这个题的解法,但是理解的不够深,以为抑或是关键,其实不是,出现了偶数次才是关键。理解了这点,推原创 2014-05-04 22:49:44 · 1278 阅读 · 0 评论 -
leetcode第一刷_Candy
这道题我觉得题目说的不是很明白,应该再具体举几个列子说明一下的,让我这英语渣渣的人理解偏了。。题目的意思是,当rate比他旁边的人大时,拿的糖一定要比他多,这并不代表一样rate的人,拿到的糖要一样多。我一开始以为同样rate的人必须保证公平,思想太共产主义了。那样我的想法是按rate排名,一层一层的更新。。这个题的解法就简单多了,应该是最直接的打表。先从左往右扫一遍,如果当前小朋友rat原创 2014-05-04 23:07:07 · 1357 阅读 · 0 评论 -
leetcode第一刷_Word Break
这种题一看,立马就会想到递归,但直接递归的代价太大了,当字典里的单词长度很小,而单词长度很长时,肯定会超时的。再仔细想一下,是不是每次递归验证都是有必要的呢?如果从i位置开始已经被验证为不行了,那么其他递归分支走到这个位置的时候就不用走了,因为肯定是死胡同。想到了打表,把不行的位置记录下来,速度显著提高。下面说一点实现的事情,记录一个位置行不行,用map最简单直接,查找速度也快。每次选择步长的原创 2014-05-04 22:00:22 · 1265 阅读 · 0 评论 -
leetcode第一刷_Evaluate Reverse Polish Notation
逆波兰表达式在本科时的编译原理有学到过,一看到它,我总是想到栈,这道题我也是这样解的。原创 2014-04-19 10:18:18 · 1156 阅读 · 0 评论 -
leetcode第一刷_Insertion Sort List
对链表的插入排序还是比较简单的,原创 2014-04-19 20:03:35 · 1059 阅读 · 0 评论 -
leetcode第一刷_LRU Cache
一直觉得跟操作系统有关的东西还是挺难的。LRU,即最近最少原创 2014-04-19 20:35:10 · 1136 阅读 · 0 评论 -
leetcode第一刷_Binary Tree Preorder Traversal
先序遍历就比较单纯一些了原创 2014-04-19 20:59:21 · 1057 阅读 · 0 评论 -
leetcode第一刷_Two sum
非常经典的一道题,如果数字有序的话,非常简单的就能想到一个原创 2014-04-19 21:41:11 · 1141 阅读 · 0 评论 -
leetcode第一刷_Gas Station
刚看到这个题时,觉得跟之前看到过的一个小猫钓鱼的题目很像,虽然具体的记不太清楚了,不过那个题用的应该是贪心,在惯性思维的驱使下,这个题的题意一开始又理解错了。。此题要求的是“走一圈回到原点”,即从位置i开始,最后还要回到i,而不是设计一个路线,踩完所有的点,使剩余的油量最大。一个更明显的条件是,题目只给出了从i到i+1的,没告诉你从i+1到i是多少,这种路线对称消耗就一样的假设完全我自己想象的。原创 2014-05-05 09:33:17 · 1481 阅读 · 0 评论 -
leetcode第一刷_Copy List with Random Pointer
这道题应该是链表中少有的几道原创 2014-05-05 09:42:24 · 1040 阅读 · 0 评论 -
leetcode第一刷_Clone Graph
这道题相当的恶心,写了好多遍,最后的结果也不满意,原创 2014-05-05 09:57:10 · 1161 阅读 · 0 评论 -
leetcode第一刷_Sort List
这道题其实是道数据结构的题,跟链表相关的问题一般都比较直接,但是比较原创 2014-04-19 10:46:54 · 1092 阅读 · 0 评论 -
leetcode第一刷_Palindrome Partitioning
仍然是一个递归加记录路径的题目原创 2014-05-05 13:59:40 · 1143 阅读 · 0 评论 -
leetcode第一刷_ Palindrome Partitioning II
这道题还挺复杂的,回来看了好一会儿才想起当时怎么想的。。上道题刚说不要打表,这道题就用了打表。。总的思路是这样的,从后面往前面打表,最后一个位置的最小分割一定是0,那往前呢,如果当前考虑的位置是start,并且substr(s, i)是回文的,那么如果已知i+1开始的分割次数,那么start这个位置的分割应该就是start原来的和i+1开始的分割次数加1之间的最小值。DP的思想,很直接。但原创 2014-05-05 20:47:54 · 1318 阅读 · 0 评论 -
leetcode第一刷_Sum Root to Leaf Numbers
有关树的问题还是比较简单的,递归递归递归,递归一万年。不,你说还有,遍历遍历遍历,遍历一万年,哈哈。一般的问题借助前中后层序都可以比较优雅的解决掉,遍历的时候常用递归,如果层序,可能需要借助队列。这道题其实没什么好说的,父亲们在构成的数字中位数靠前,一定是先序遍历嘛,到达叶子更新一下总和。这里说实验室一个同学面试遇到的更有意思的问题,也是树的。已知树上两个节点有祖先和后辈的关系,怎样只用一次遍原创 2014-05-05 21:03:58 · 1317 阅读 · 0 评论 -
leetcode第一刷_Longest Consecutive Sequence
给你一个数组,O(N)时间找出某些个数,这些题如果没见过,还真不是很好想。做了这些题,我觉得有下面两个个比较常见的思路:1. 用两个指针,可以从一边开始,走某个距离停止,也可能是一头一尾两个指针,定义一种大小关系,他俩比较之后移动,直到相遇。2. 用其他的辅助的数据结构,可能是hash表,可能是map,可能是栈或者队列。这种通常用在访问了现在的不能确定他们是不是有用,是不是能影响最后的结果原创 2014-05-05 21:20:43 · 1255 阅读 · 0 评论 -
leetcode第一刷_Word Ladder
这道题思路不难,本质就是BFS嘛,从一个单词开始,他的下一层是所有可以一步变到,且从来没变到过得那些string。问题是怎样确定这些可以变到的string呢?有两个条件,一,只能通过上一层的string变化一个数字得到,二,变化之后单词必须在字典中。注意是变化一个字母得到,而不是编辑距离是1,要么就复杂了,情况多了好多好多。我最开始的思路是建个map,保存所有从开始单词能变化到得单词及这些单词原创 2014-05-05 21:35:20 · 1330 阅读 · 0 评论 -
leetcode第一刷_Valid Palindrome
水题。只要注意一点,题目写的是alphanumeric,包括了数字hen原创 2014-05-05 21:38:12 · 1062 阅读 · 0 评论 -
leetcode第一刷_Binary Tree Maximum Path Sum
这是道好题。原创 2014-05-05 22:04:58 · 1239 阅读 · 0 评论 -
leetcode第一刷_Binary Tree Postorder Traversal
树的结构决定了有关他的原创 2014-04-19 20:48:01 · 1103 阅读 · 0 评论 -
leetcode第一刷_Reverse Words in a String
这道题非常常见,在primer上甚至有现成的详细代码。主要的原创 2014-04-19 10:05:58 · 1105 阅读 · 0 评论 -
leetcode第一刷_Palindrome Number
判断一个数字是不是回文数字。不用想都能想到两种思路:一,读入到一个字符串中,一位一位判断这个字符串是不是回文,简单暴力,有额外的空间。二,先把数字翻转一下,看看相不相等,不用额外的空间,但要判断溢出等特殊情况,不是很方便。网站上提示说有更加一般的方法,自然想到一位一位的判断嘛。从两侧,每次取出一位比较,右侧的比较简单,每次/10之后取余即可,左侧的麻烦一些,我的做法是不断除某个首位为1其余位为原创 2014-04-20 11:50:09 · 1078 阅读 · 0 评论 -
leetcode第一刷_Container With Most Water
很不错的一个问题,自己没想到O(N)的算法,看了discuss才写出来的。算法的思想是这样的,两个指针,一头一尾,计算容量,更新最大的容量,如果左侧位置的高小于右侧的,左侧的右移,否则右侧的左移,知道两个指针相遇。怎样证明算法的正确性呢,discuss中的作者使用了反正法。假设使用这个方法得到的结果不是最优的,那么假设最优的那两个位置分别是left和right,因为我们的算法会扫描到两个指原创 2014-04-20 12:06:47 · 1259 阅读 · 0 评论 -
leetcode第一刷_Best Time to Buy and Sell Stock III
这道题还是挺难的,属于我前面提到的,给个数组,线性时间找出个什么东西,虽然上面的两个买卖股票也是这类,不过相比之下稚嫩多了。有关至少至多的问题比较烦人,不好想,等再做一些题,可能会发现什么规律。这道题的情况还是比较少的,要么买卖了两次,要么一次。买卖一次的情况,已经解决过了,现在分析买卖两次的情况。两次买卖之间是没有交叉的,即下一次买之前一定已经卖掉了。最容易想到,穷去分点,每个部分都按照买卖原创 2014-05-07 10:06:14 · 1497 阅读 · 0 评论 -
leetcode第一刷_Reverse Integer
这道题的难点倒不是他的方法,方法简单直接。是要注意一些特殊情况的处理。正好这里复习一下组成原理的一点问题,计算机中各种码的表示和范围。8位源码的范围是【-127,127】,源码的0有两种表示方式,0x00和0x80,8位反码的表示范围跟源码一致,反码的0也有两种表示方式,0x00和0xff,补码的范围是【-128,127】,补码比源码和反码多表示了一个数,因为它只有一种0,0x00,最大的正数原创 2014-04-20 11:35:17 · 1316 阅读 · 0 评论 -
leetcode第一刷_Longest Substring Without Repeating Characters
最长无重复字符的字串。很容易想到暴力法,原创 2014-04-20 10:13:31 · 1055 阅读 · 0 评论 -
leetcode第一刷_Best Time to Buy and Sell Stock
这种题就不要去考虑N^2的算法了,肯定会超时的。乍一看,很可能会想到贪心,原创 2014-05-07 09:31:13 · 1140 阅读 · 0 评论 -
leetcode第一刷_Longest Palindromic Substring
最长回文字串,是非常有意思的一个问题,有很多解法,复杂度从O(N^4)到O(N)不等,比较容易想到一个O(N^2)的解法,穷举中心,然后从两个方向比较,需要注意的问题是有两种情况,即回文可能是奇数长度也可能是偶数的。处理方式是不同的。这里介绍一种O(N)算法的实现。算法思想是先在源字符串的每个字符之间插入特殊字符,并在头部加上另一个特殊字符,这样把所有长度的源字符串转化成了奇数长度的串,可以统原创 2014-04-20 11:01:34 · 1270 阅读 · 0 评论 -
leetcode第一刷_String to Integer (atoi)
思路再清晰不过,难点在于特殊输入的处理。想起之前一个问题用到string转int,没用这个充满c意味的函数,直接中stringstream搞得,哈哈。特殊的输入主要有一下几点,对网站上要求的简单翻译:1.字符串开始时可能有空格,忽略。2.数字前面可以有“-”和“+”,作为正负号来处理。3.数字后面可能有其他非数字的字符,忽略之。4.溢出的处理,超过最大整数或者小于最小负数,输出原创 2014-04-20 11:42:18 · 1257 阅读 · 0 评论 -
leetcode第一刷_Add Two Numbers
链表的问题又是那样的纯粹和麻烦。两个链表相加,原创 2014-04-20 10:23:19 · 1062 阅读 · 0 评论 -
leetcode第一刷_ZigZag Conversion
乍一看很难,实际写起来不难的问题。直接写我的思路了。我把zigzag之后的字符们看做是在一个矩阵中的,矩阵的行数是输入,矩阵的列数可以根据字符串的长度和矩阵的行数确定,然后依次算出每个字符在这个矩阵中的位置,每个位置对应一个大小各不一样的key ,用map一存,自动有序。输出即可。实现的时候,为了计算出各个字符的位置,我用一个direc量来代表字符摆放时的方向,如果方向是往下的,那么列编号原创 2014-04-20 11:13:06 · 1320 阅读 · 0 评论 -
leetcode第一刷_Best Time to Buy and Sell Stock II
这道题虽然是上一道题的增强,但是反而简单了。可以交易无数次,但是买卖必须成对的出现。为了简单起见,我用abc三股股票来说明,且忽略掉相等的情况。三个数一共有六种大小关系。注意他们之间的先后顺序是不能乱的。1. a2. b3. a4. b5. c6. c好的,你已经看出来了,只要当相邻的两个数是后面一个较大时,就之间累计上他们的差,否则,pass。直观一点的表述,只要原创 2014-05-07 09:48:33 · 1424 阅读 · 0 评论 -
leetcode第一刷_Triangle
很简单的一道DP,看到空间限制是O(N)的,不要习惯性的以为是要保存每一行的最小值,不难想到是要保存一行当中各个数为路径终点时的和的大小。当算到最后一行时,就是从顶部到底部以这个底部位置为终点的最短路径和,找一个最小的就可以了。实现的时候要注意个问题,因为计算时要用到上一行的数据,所以为了避免数据被覆盖,应该从后往前算,这个技巧用的很多,相信大家都很熟悉。ac代码如下:class So原创 2014-05-07 22:45:28 · 1265 阅读 · 0 评论 -
leetcode第一刷_Distinct Subsequences
应该可以想到是个dp,但是转移方程很难理解。首先要理解题目要的是什么,求s中包含了多少个形式为t的字串。那么中间结果保存的应该是什么呢?有三种选择,第一,p[i]表示s的前i个字符包含了多少个t,那看看规模扩大时,小规模怎么更新到大规模,当s的长度增加1的时候有什么变化呢,p[i]应该是在p[i-1]的基础上加个数的,但t的规模是固定的,做不到更新。比如aaab中包含了一个ab,那么aaabb原创 2014-05-07 23:36:13 · 1218 阅读 · 0 评论 -
leetcode第一刷_Pascal's Triangle II
杨辉三角形的问题比较简答,第一题实在太简单,我都不往上贴了,肯定都会写。原创 2014-05-07 22:49:34 · 1040 阅读 · 0 评论 -
leetcode第一刷_Populating Next Right Pointers in Each Node
这道题之前没见过,一上来还真不知道怎么做。问题的限制条件,树是完全二叉树其实并不是关键,只不过是一个简化的条件而已。那关键是什么呢?如何从当前节点跳到下一个开始的节点。我的做法是,每次从一层的最左边节点开始,一层一层的走。其实只有两种形式的next指针需要我们来更新,第一种,同一个节点的左右孩子,第二种,父亲相邻时,左边父亲的右孩子和右边父亲的左孩子之间。完全二叉树的简化就体现在更新的过程,因为完原创 2014-05-07 23:00:01 · 1357 阅读 · 0 评论