our's LeetCode
文章平均质量分 80
[C++版] LeetCode上的题目真的挺不错的,所以我准备试一试,虽然算法功底不是很好,但是我们可以不断积累,我想把我的刷题记录下来。
_从未止步
just do IT
展开
-
LeetCode 72
Edit Distance题目意思是将一个字符串变换为另一个字符串所需要的最少的操作次数。变换的方法包括: 1.替换一个字符 2.插入一个字符 3.删除一个字符 明白了题意之后,我们就可以动手去做了,这是一个动态规划的题。拿到这个题目的时候,我感觉有点无法动手,老是想着是否存在着某些特殊情况需要我们特殊处理。这种题目确实不怎么直观,所以一定要注意方法。原创 2016-12-26 18:03:00 · 556 阅读 · 0 评论 -
LeetCode 71
Simplify Path 这个题是给出一个字符串的相对路径,让我们返回绝对路径,让我们在Linux下自己去动手操作确实不难,可是用程序做起来的话确实比较麻烦。 我的解题思路是找好‘/’和‘.’之间的关系,找好他们之间的组合关系后这个题就容易一些。在路径中‘.’和‘/’的组合正常的可能只有‘.’和‘..’两种。‘/’是起修饰作用的,说明当前目录下可能还存在目录。原创 2016-08-01 00:21:40 · 562 阅读 · 0 评论 -
LeetCode 70
Climbing Stairs这个题的意思是爬阶梯,一次可以爬两个台阶或者一个台阶,问有多少种方法爬到顶。这确实是个easy的问题,见过这种问题的人可能很快就能写出代码,因为这个问题就是斐波拉写数列,它符合一个一个递推关系式: F(n) = F(n-1) + F(n-2)所以我们可以采用递归和循环的方法来解题,不过这类问题的递归解法效率太低(因为它展开后就像一个完全二叉原创 2016-07-06 23:44:12 · 1093 阅读 · 0 评论 -
LeetCode 69
Sqrt(x) 没错,有几天没写LeetCode了,就遇上了sqrt函数的编写,这是不是很简单呢?于是我很快的想出了遍历的方法,但是马上又想到了若是一个最大的整数位测试用例呢?那么效率太低了吧,于是我以效率为出发点又想到了二分法,使用二分法自己测试了几个,感觉还可以,于是就提交了,代码如下:class Solution{public: int mySqrt(int x)原创 2016-07-04 23:28:46 · 2016 阅读 · 0 评论 -
LeetCode 68
Text Justification 这个题的意思比较简单,但是情况很复杂,输入一些列单词,然后将这些单词按照规定的长度组合,参照例子大概就可以知道组合的规律,首先分析一下,然后再给出解题思路。这个题的规律如下:(1).每两个单词之间有一个空格,一行中若有些单词无法完全排列下来就将它放在新的一行中。(2).最后一行和他之前的所有行有些不一样,最后一行是按照一个单词一个空格来排列原创 2016-06-24 21:04:37 · 2027 阅读 · 0 评论 -
LeetCode 67
Add Binary 这个题的意思比较明了,计算两个字符串表示的二进制数的加法,可以参照示例看看,意思还是比清楚的。我的思路是从右往左计算,将他们的和放到一个新的string中,其中最主要的是要处理进位,进位的处理需要一直处理,我分别举出相应的例子说明一下吧:(1). "10"+"11" 这两个字符串一样长,所以最后加完以后,最后的还有一个进位需要处理。(2)原创 2016-06-18 14:56:29 · 1619 阅读 · 0 评论 -
LeetCode 66
Plus One 首先解释一下这个题的意思:一个非负数的内容从高位到低位(十进制位)依次放到数组的每一位,例如:123,存放到数组中就是[1,2,3],现在将这个数加 1 ,返回加1后的结果,如[1,2,3]应该返回[1,2,4]. 弄清楚了题意以后解题就变得简单了,这个题的思路是从最低位开始,将它加1,若产生进位就依次往高位处理进位,直到没有进位为止。 有一点需要注意原创 2016-06-18 12:09:37 · 2070 阅读 · 0 评论 -
LeetCode 65
Valid Number这个题意思是判断一个字符串是否是一个合法的数字,看起来简简单单的一个题,但是我认为若是在面试过程中去写这个题的话,我相信90%的人写不对,写的时候真让人很崩溃。测试用例对有些情况的解释又有些不合理,但是情况确实很多,下面我们首先来见见测试用例吧!int main(){ Solution A; //string s1 = ""; //false原创 2016-06-15 20:34:01 · 1501 阅读 · 0 评论 -
LeetCode 64
Minimum Path Sum 没错,机器人的问题还没有完!这一次我们是找权值最小的路径,问题意思是这样的:从最左上角位置走到最右下角位置,且只能向右或者向左移动,而且每个位置对应着一个权值,找出所有路径中权值和最小的一条路径的权值和。 其实仔细看的话,这和之前的题的解题思路相似,我的思路是开辟一个和原二维数组一样大的二维数组(取名叫做V)用于记录到达每个位置的权值的和原创 2016-06-12 09:04:27 · 769 阅读 · 0 评论 -
LeetCode 63
Unique Paths II 这次还是机器人在最左上角,想要到达最右下角,机器人能走的方向还是向下和向右,但是与上次不同的是:路上有障碍物,有障碍物的地方不能通过,找出所有独一无二的路径。 上个题的解题思路我自己好像也没什么算法根据,凭借的是自己观察问题找到的,不过这个题我还是按照那样的想法去做的话,确实没想通,我试了一下,发现代码很复杂而且没有把握,所以我换了种思路,我原创 2016-06-09 18:27:06 · 2045 阅读 · 0 评论 -
LeetCode 62
Unique Paths 机器人在最左上角,它只能向右和向下走,找出所有的独一无二的路径,使它能达到最右下角位置。 对已这个题我首先的思路是递归,因为机器人只能向下和向右走,所以将下和右方向的路径加起来就行了,代码也清晰明了,代码如下,想法是好的,可是现实是残酷的,时间复杂度不够。class Solution {public: int uniquePaths(int m原创 2016-06-08 23:16:53 · 2319 阅读 · 0 评论 -
LeetCode 61
Rotate List 这个题的意思旋转链表,更具体点的意思右移链表,移出去的节点放到头部前面,结合着题目给出的例子还是很好理解的。 这个题的主要思路是:摘取从末尾到头的k个节点,然后将他们放到头部。需要注意的是,上面说的k并不一定等于传入的k的值,因为这个k很可能比链表的长度还大。所以我主要思路是:遍历一遍链表,找到链表的长度n,然后k%=n(这时候k原创 2016-06-05 14:48:18 · 1610 阅读 · 0 评论 -
LeetCode 60
Permutation Sequence 这个题是求1~n (n[1~9]) 的数字的全排列的第K个序列。 一般思路是:使用一个计数器,递归去找全排列序列,找到一个计数器加一,一直到第k个。但是加若 n = 9 我要找的是第 (9! -1 )个数,那么上述办法的时间是多少,多半会超时的(没试过,但是我敢保证一定会超时的,因为这样的思路不可取),想一想我们只需要一个序列,原创 2016-06-04 14:16:05 · 2695 阅读 · 0 评论 -
LeetCode 59
Spiral Matrix II 看上图就能知道这个提示要干什么的,给定一个 n 值,按照螺旋数组的存储特点将 1~N^2 存放到螺旋数组中。 思路:使用一个计数器(引用的方式使用),然后按照螺旋数组的方式去遍历的特点依次将该计数器的值赋给数组相应的位置,遍历完成后就是上述的样子了了,需要注意一下几点。 1.我们需要实现分配空间(讲vector的大小给定),否则肯定会崩溃原创 2016-06-02 17:32:24 · 2415 阅读 · 0 评论 -
LeetCode 58
“ Length of Last World ” 题目是多么的清晰明了,求一个单词序列的最后一个单词的长度。思路:从尾往头遍历,找到空格说明最后一个单词结束,统计它的长度就行了,但是如此简单的题目也有一些陷阱的,看看我的测试用例先! (1).正常情况 (2).只有一个字符组成的单词 (3).只有一个的单词,但是它开始之前有'空格',但是空格之前又没有单词(由其原创 2016-06-01 09:03:03 · 748 阅读 · 0 评论 -
LeetCode 57
这个题接着上个题的,这个题还是给定一个由区间构成的数组(vector),现在又来了一个区间,将这个区间放到"集合"中,但是要求集合最终是有序的。 这个题的解题思路是:遍历一遍数组就可以了!原因如下: (1). 原区间数组肯定是不能再合并的,所以插入的这个区间,可以联通和它有公共部分的区间,其他的区间肯定不会被改变的 (2). 想清楚上面这个,我们遍历一遍数组,将能够合原创 2016-05-31 10:20:21 · 881 阅读 · 0 评论 -
LeetCode 56
这个题的意思是:给定一组"区间",将所有能够合并的区间合并,返回最终的区间的集合。说实话拿到这个题的时候多么希望这些区间是有序的(就是所有区间按照起始大小排好序了),为此我强行将它当作有序的,还写了代码进行提交,然而结果是题目给出了 "[[2,3],[4,5],[6,7],[8,9],[1,10]]" 这样的测试用例。好吧,说明这些区间是无序的,这下难度增加了很多,说实话解题的思路我一时真的没原创 2016-05-30 11:11:28 · 1081 阅读 · 0 评论 -
LeetCode 55
这个题是个复杂的跳台阶问题,主要是测试能否跳到最后,它不像之前那些跳台阶问题了,之前的不会考虑能否跳出去的问题。所以之前的程序用在这里很可能会导致死循环;我的主要思路是"贪心算法+筛选条件"来解题。 1.贪心算法主要是用来减少跳的次数 我们可以从当前位置(cur)可以跳的步数(N),以及当前位置所跳的范围内[cur~cur+N]中每个台阶能跳的最大距离原创 2016-05-28 12:13:54 · 3195 阅读 · 0 评论 -
LeetCode 54
这个题挺有趣的,螺旋数组,意思是给定一个m*n的数组,按照螺旋的形状去遍历这个数组,求出螺旋遍历的数组的顺序。 还记得前面的那个旋转数组的题吗?这个题和那个题异曲同工,主要的思路是:先遍历一圈,然后依次遍历里面的圈。不过这道题需要注意的旋转数组的题要复杂一些,条件的控制复杂一些,我举个例子吧: 我们可以顺时针方向遍历数组,就上上图所示一样;不过上面两个数组有什么特点吗?原创 2016-05-27 12:09:43 · 828 阅读 · 0 评论 -
LeetCode 53
此题是给定一个数组,找出数组中连续位置(一个区间)中所有数的和并且该和是所有区间中最大的。这个题看起来很难的样子,但是我们仔细想想的话,它的解法挺简单的! 主要思路是使用两个临时值,cursum(用来保存当前和),maxsum(用于保存最大和),方法是。从头到尾依次相加各个数,若当前和cursum > maxsum的话,那么将cursum的值赋给maxsum;若cursum ,这时候应该将原创 2016-05-26 16:57:53 · 676 阅读 · 0 评论 -
LeetCode 52
这个题的意思是让我们求“n 后问题”的解法的数目,其实和上一个题基本是相似的,只需要做少量的改动就行,主要的思路如下:1.使用 vector 保存每一层的Queen的位置,然后往下一层递归,测试下一层Queen的位置,若符合要求就继续上下测试,若不符合则更换位置继续测试。2.测试函数的编写需要注意,记得斜线sh原创 2016-05-25 11:23:48 · 3701 阅读 · 3 评论 -
LeetCode 51
相信学习过算法的人都知道“N后”问题,今天我再次遇到了N后问题,之前确实只是知道算法思想,从来没想到到能自己实现“n后”问题,不过就在今天我实现了以前未达到的一个目标!“n后”问题就是在一个 N*N 的方格中放入n个皇后,但是皇后可不是一般人,她比较刁蛮任性,只要是和她在一条线上(包括水平方向和竖直方向)的所有人她都攻击,不仅如此连在她斜线上的也不放过,所以我们这些程序员没有办法,只有设计出一种让所原创 2016-05-24 12:17:37 · 650 阅读 · 1 评论 -
LeetCode 50
这个题让我们自己实现一个 pow(x,y) 函数,看起来简简单单的一个函数,我相信绝对可以难倒一片人的,因为我们很难将它"写对"。我之前其实也见过这个题的,在剑指offer上就出现过了,我感觉我写这个算法没有问题的,我考虑了很多方面而导致程序看起来比较的乱,最终修改了好几次才正确。 我个人感觉这个题比较重要的一点是 pow(x,y) 的功能的处理比凸显代码能力吧,首先比如: pow(原创 2016-05-22 17:44:08 · 3205 阅读 · 0 评论 -
LeetCode 49
这个题目的意思是,给出一组单词,找出其中所有"异构"的单词组,异构的条件是单词的组成字符的种类和各字符出现的次数相同,上面图中的例子就可以说明这个问题,不过这个题也有一些要求:最后各个单词组必须有序,即按照单词大小排序。 我看到这个题的时候,首先的思路是:使用 map 结构,然后将每个单词排序----------异构的单词排序后一定相同,并以排序后的单词作为key值,然后循环去找和当前原创 2016-05-21 18:04:36 · 739 阅读 · 0 评论 -
LeetCode 48
这个题的意思是给你一个2D的图像(我们知道2D图像是由(x,y)像素点组成的),题目要求我们将这幅图形顺时针旋转90度,确实是一个比较有趣的题目。 如果你是第一次拿到这个题的话确实比较难动手,但是一旦你见过这类似的题目(比如:剑指offer上面的螺旋数组),那么你就瞬间有思路了。我先画个图解释一下这个题的思路: 主要思路也是由外向里,每次旋转掉一层,重复上面操作,知原创 2016-05-20 21:23:32 · 4694 阅读 · 0 评论 -
LeetCode 47
这个题是对上一个题的变形,变化的条件是数组里面可以出现相同的元素,这样确实加大了难度。不过在上个题的基础上我们可以把精力主要放在怎么处理重复的数字。如果没有记错,我们之前的一道题也是类似情况,我看了一下是 LeetCode 40 ,那个题是nsum问题,这里我们还是可以借鉴那种思想去处理重复的数字,我们还是用 prev 变量来保存已经使用过的值,下次遇到相同的值的时候我们就可以直接跳过,利用这样的原创 2016-05-19 18:22:44 · 4015 阅读 · 0 评论 -
LeetCode 46
做完了字符全排列后又来道数字全排列?没错,这道题是数字全排列,给你一个数组,数组里面的元素不同,问这些数字有多少种组合方式。这道题的题目比较直观,很容易理解,于是我们也就可以更容易的去思考解题方案了。 毫无悬念,这道题用递归解答比较容易吧?其思想是:分别将某一个数字当做一个独立单位;然后不断将剩下的数字当做单独的单位按次序加入进来;递归回来后与其后面的数字交换顺序然后重复操作;最后就可以原创 2016-05-18 15:47:04 · 765 阅读 · 0 评论 -
LeetCode 45
这个题目是一个特殊的跳台阶问题,给定一个数组,每个数组里面存放的是该位置可以跳的步数,求出跳到最后位置所需要的最少的步数。我看到这个题目的时候脑子里面的第一印象是递归,递归去求解肯定是可以的,于是我写了下面的代码(结果是超时!)解法一,递归查找,时间效率太低了。。。不行class Solution {public: int jump(vector& nums) { /* 数组原创 2016-05-17 20:03:04 · 2908 阅读 · 0 评论 -
LeetCode 44
这道题是一道类似正则表达式匹配的题目,但是我发现这个题的难度比之前那个题的难度高几个档次。如题目所示:'?'可以匹配任意一个字符,而 ' * ' 则可以匹配任意一个字符串,给你两个字符串,主串和模式串,判断他们是否可以匹配。 这道题的难度在于‘*’的处理,到底‘*’要和多少个字符串匹配呢?这个问题不好解决,我一开始的思路是:1.遇到s[i] = p[i] || p[i] =='?'原创 2016-05-16 18:13:47 · 3903 阅读 · 0 评论 -
LeetCode 43
这个题是个大数乘法运算的题,两个乘数以string的形式给出,求他们相乘的结果,题目给的限制条件是: 1.所给的数字可以任意的大,但是不为负数 2.不能将题目所给的string转化为整数 3.不能引入大数运算相关的库从题目的描述中我知道了这个题让我们自己去实现大数运算的乘法,就是这么个意思,那么我们开始吧:在纸上算的时候我们都会,可是用程序原创 2016-05-15 15:49:01 · 4280 阅读 · 0 评论 -
LeetCode 42
这个题是给出一个数组,求该数组元素所构成图形能装水的量,如上所示图形给出了一个示例,这个题是一道很复杂的题,这种题型必须得在纸上画一画可能出现的情况,否则真的很难得出正确答案的。我的思路是去找低谷,有低谷一定可以构成”容器“,需要注意的细节如下: 1. 首先找到低谷,找连续递减的序列的最后位置,找到该位置了,再去找递增的序列,找到顶部,为了方便说明我画图分析一些容易出错的地方吧。原创 2016-05-14 18:56:35 · 3301 阅读 · 2 评论 -
LeetCode 41
这个题是找出无序数组里面的第一个不连续的正整数,而且时间复杂度不超过O(n)。首先分析一下:数组是无序的,需要找出第一个不连续的数字,而排序的算法一般很难达到O(n)的时间复杂度。这个时候我们必须得明白一种做法:空间换取时间的做法,我首先想到的是位图即bitmap(STL中交bitset),位图可以节约空间,而且可以判断出数字是否出现,真的是比较理想的数据结构。于是我就在函数中使用了bitset:原创 2016-05-13 14:50:47 · 4126 阅读 · 0 评论 -
LeetCode 40
这个题目还是nsum类型的,不过比上个题更难。上个题的复杂性不是很高,因为不需要考虑到元素的重复性对结果造成干扰,但这道题的话,还是在“集合”里面找出 nsum = target, 每个元素只能使用一次且最后的结果不能重复。那么对于“集合”里面出现的重复的元素的处理就特别棘手。其实代码和上个题的差不多,其实只多了几行,但是这几行代码我却想了一天,甚至睡觉前还想了一段时间,但是下午在做实验的时候突然原创 2016-05-12 18:53:12 · 3890 阅读 · 0 评论 -
LeetCode 39
如果还记的话或者写过LeetCode的人会知道,这是nsum,已经不再是之前的twosum,threesum,foursum了。之前是都是使用 i 层循环解题的,那么现在n层循环理论上是可以解题的(其实应该不行),但是n是不确定了,而且是可变的,其变化范围是[1,n]说道这里其实想说明的是,我们要换种思路去解题了。我在看到这个题的时候想到的思路是: 我们从小到大一个一个将最小原创 2016-05-11 15:44:56 · 3543 阅读 · 1 评论 -
LeetCode 38
这个题是个数字规律题,题目的意思是,给定一个值 n,按照规律列出第 n 个数字,规律如上图中所示,大概的意思是,表示左边的数字的下一个数字,例如:1. “1”,它由 1 个 1 表示,则变成“11”2. “11”,它由2个1组成,则变成“21”3. "21",它由1个2和1个1组成,则变成"1211" 规律就是上面这样了,还是比较容易理解。代码如下:原创 2016-05-10 19:29:43 · 913 阅读 · 0 评论 -
LeetCode 37
果然不出所料,我还是遇到这个题目了,哈哈,既然那么有缘份,那么我们怎么能不解决这个题呢?数独问题求解,我上次就想过这个问题,一般思路是用回溯法,就是补空位然后测试该值是否合法,一步一步往下递归,遇到不合法的就回溯到出问题的位置,然后修改该值,再进行测试,这样有两种结果 1.要么最后成功 2.要么一个位置 1~9 都不能满足题意得话则直接退出 我觉得这种题目,首先要理解解题的思路,我是原创 2016-05-09 16:46:40 · 1005 阅读 · 0 评论 -
LeetCode 36
这个题目是一个“数独”问题的求解,数独就是由9个九宫格组成的,规则是每行没列包含数字1~9,且每个九宫格内也是有1~9组成的,现在让我们判断数独是否合法。 这个问题比较常规了,我们按规矩行事就行了,既然数独的规则是:每行,每列,每宫,都是数字1~9,(此题中并没有全部给出数字,没给出的地方用‘ . ’代替),所以我们只要判断每行,每列,每宫的数字字符是否合格即可 这原创 2016-05-07 20:23:12 · 980 阅读 · 1 评论 -
LeetCode 35
这个题目还是属于查找类的题目,和前面的题目比较类似,题目的要求是给定一个target,在有序数组里面查找该元素的插入顺序,若存在了则返回该元素的下标。这道题比较直观,所以比较容易动手,需要注意到的应该就是边界条件的问题吧,比如说:(1). 目标元素比排序数组中的最小元素还小(2). 目标元素比排序数组中的最大元素还大 请看代码吧,代码写的还是比较清晰的class Solu原创 2016-05-06 14:00:44 · 949 阅读 · 0 评论 -
LeetCode 34
找排序数组特定元素的区间,意思是找开始下标和结束下标,但是题目给了要求时间复杂度低于 O(n),这就告诉我们不要使用遍历数组的方式来解题。我们查找单个元素的时候可以二分查找来完成,但是找区间的时候改用什么呢?比如:数组的排列顺序为:5 7 7 8 8 10,而 target = 8 ,我们该怎么找呢?答案还是二分查找,但是思路是这样的:我们先用二分查找找到 target 的大致位置,然后再利用该位原创 2016-05-05 18:00:51 · 563 阅读 · 0 评论 -
LeetCode 33
这个题是将一个排序数组部分扭转一下,导致数组成为部分有序的两部分,现在给定一个target,最后找出该target的下标,若不存在则返回-1,题目意思还是很好理解的,但是求解的时候确实比较麻烦的。为什么麻烦呢?因为遍历一遍数组的方法并不适用,而且这样的做法也没有意义! 所以我们得另外开辟路径,我们平时在查找有序数组的时候用的最多的方法是二分查找法,那么这个题能否使用二分查找呢?答案是可原创 2016-05-04 15:14:51 · 2201 阅读 · 0 评论