leetcode
Raintin_coder
白板练成中
展开
-
324. Wiggle Sort II
今天这道题还是颇有难度,据说是2016年Google的面试题原题,看了大神的代码,简短的三句代码愣是没搞清楚说了啥,好在经过一天的折腾理清了思路。题目要求是要让数列呈现 第一个数小于第二个数,第二个数大于第三个数,第三个数小于第四个数,以此类推,难点在于要用时间复杂度为O(n),空间复杂度为O(1),来解决这个问题。分析题目我们得到,如果没有时间复杂度和空间复杂度的限制,我们只需要将数字分...原创 2018-09-01 22:16:00 · 537 阅读 · 0 评论 -
37.sudoku-solver
这道题是数独游戏,规则我们很清楚,小时候一般小孩都玩过,所以,题目大体意思比较好懂。 题目大意:给定一个9*9的二位数组,与数字和"."组成,按照数独游戏规则,在"."处填入数字,使得整个矩阵的每一行都是由1~9组成且没有重复,每一列由1~9组成且没有重复,9*9的矩阵可以分成9个3*3的二位小矩阵,而9个3*3的矩阵中,每个都是由1~9这9个数字组成,且没有重复。 ...原创 2018-10-17 12:19:43 · 352 阅读 · 0 评论 -
41. first-missing-positive
这道题呢技巧性比较强,对于像我这样的新手第一次一般是想不出来这种方法的。 题目的大意是找出一个int数组中第一个缺失的正整数,比如:0,1,3,5. 这组int数组中,第一个缺失的正整数是2,当然最直观的思路是我从1到n一个一个到数组中去寻找,看第一个缺失的谁,这样复杂度是O(N^2),而这种思路代码比较简单,另一种比较新颖的思路是利用下标和正整数之间的关系,来完成寻找,...原创 2018-10-17 15:29:32 · 206 阅读 · 0 评论 -
51.N-Queens
这道题是一类比较经典的题目,和数独以及leetcode上的其他题目一起构成了比较典型的一个类型题集,本质就是迷宫问题,基本的解决算法就是深度优先遍历DFS。 题目的大致意思是:在一个棋盘上,每一行和每一列都有且只能有一个Q棋子,且45度对角线上也只能由一个Q棋子。 实际上我们就一行一行的放置,第一行选择一个位置放置Q,接着到第二行放置,因为深度遍历的时...原创 2018-10-22 12:18:11 · 139 阅读 · 0 评论 -
42.trapping-rain-water
以前在听算法课的时候,有一个人说过这样一句话,凡是那道题没有思路的9成要用动态规划,当然可能说的有点绝对,但是不无道理,就是说,一般的题目我们遇到后能立即想到思路,哪怕是那种很麻烦的,但是动态规划往往是麻烦的也不一定能想出来。而动态规划的难度也确实比较大,其灵活性很高,他不同于字符串,数组,排序这种的某一类问题,他是一种思想,渗透到各种各样的问题的当中,而leetcode有关动归的问题...原创 2018-10-17 16:30:05 · 836 阅读 · 0 评论 -
44.wildcard-matching
这道题也是正则表达式类的题目,和10题有很大程度的相似度,个人感觉难度上来讲,这道题要简单一点,有一点需要注意的是这道题不能用递归来解决,看到有个测试用例会超时,但也可能是我自己的思路上有缺陷,如果有大神,肯请指点。 这道题是*号表示任何字符串包括空串:"",?表示可以与任意一个字符串匹配,所以,最特殊的还是*号,我们分情况讨论,1、假设当前p[i] = s[j] 或...原创 2018-10-17 17:53:50 · 257 阅读 · 0 评论 -
57. Insert Interval
这道题刚开始有点难想清楚,所以,代码上可能就会比较麻烦,但是一旦想清楚了,就会简单很多。个人感觉难度不算太大。 题目大体意思:给定一组互不相交的升序区间,再给定一个需要加入该组的区间,求出最终的包含的区间范围,要求如何新加入的区间与原有区间之间出现了重叠,就将其合并,从而得到最终结果。比如:原本的区间是包含:[1, 5],[6, 7] 给定的新区间[2,6],则最...原创 2018-10-22 15:39:35 · 204 阅读 · 0 评论 -
160. intersection-of-two-linked-lists
这道题是一道很有意思的题目,值得看一下。题目大意是:给定两个链表,这两个链表和平时遇到的链表的区别在于他们最终有可能汇聚在一相同的一点上,如图所示,但是,并非一定能重合。如果有重合点,返回该重合点,如果没有返回NULL。假设我们考虑一种比较极端的情况,就是在回合之前,两个链表的节点数是相等的,那么,同时向后便利节点,一定能找到汇聚的情况,即使是两个不相交的链表,最终也会汇聚到NULL地...原创 2018-10-20 12:07:16 · 114 阅读 · 0 评论 -
168.excel-sheet-column-title
这道题乍一看挺简单的,就是10进制转换26进制的问题,但是,并非我们平时所说的10进制到26进制的转换方法,用短除法求出来的结果和测试用例不太吻合,这主要是题目做了一点小小的变动。题目大致意思:1-26分别对应A~Z这26个字母,AA表示27, AB表示28,……,AZ表示52,……,程序给定一个int型正数,则按照上述规则,求如何转化出对应的字母。根据题意,这并不是一个完全的26进制转化...原创 2018-10-20 17:55:05 · 125 阅读 · 0 评论 -
76. minimum-window-substring
这道题细节处理起来还是有点难度,太不是难到没有思路的那种。 题目大意:给定两个字符串,一个是原始匹配串,另一个是目标串,在匹配串中选寻找一个最短的字串,包含目标串的所有字符,重复情况要考虑。例如:abdccab 目标串是 abccd,则原始匹配串中最短的字符串是dccab 思路,首先,并不是KMP求目标子串,条件没有那么严格,所以,先要记录目标串中每...原创 2018-10-25 10:42:13 · 424 阅读 · 0 评论 -
84. largest-rectangle-in-histogram
这道题难度还是蛮大的,主要是不太好想,反正第一次我是没想出来,后来看了大神的思路后,才慢慢理解的。 题目意思是:给定一组宽度为1,高度不定的矩形,求这些矩形组成的最大面积是多少,实际上大矩形的高度取决于最短的那个。 具体的思路是,利用栈来保持一个递增的序列,比如输入1 2 3 4 5,就将其入内,如果此时再出现一个4,则需要将5弹出,并计算的当前...原创 2018-10-25 11:38:15 · 417 阅读 · 0 评论 -
204. count-primes/hints
这道题还是挺有意思的,找质数,如果按照最笨的方法一个一个遍历,需要的复杂度是O(N*N),但是显然复杂度比较高,所以,需要找到时间复杂度比较低的方案。 题目大意 :给出一个数,找出所有小于该数的质数,并输出质数的个数是多少。 首先,我们找到第一个质数2, 然后将2的整数倍且比n小的元素都置为0,这样4,6,8,……都置为0,然后继续寻找第二个质数,找到了...原创 2018-10-23 11:28:36 · 128 阅读 · 0 评论 -
306. additive-number
这道题个人感觉难度还是挺大的,一开始一直在想有什么简单的方法来解决,但是,似乎找不到比O(N^2)更小的方法,如果有更好的方法,希望大家不吝赐教。其实这道题有几个问题比较关键,第一个,字符串转换成数字进行计算,最终要判断字符串是否满足斐波那契数列。 第二个,剔除非法字符情况,第三,字符串可以很长,但是int数字的最大位数是固定的。 题目大体意思是:给定一...原创 2018-10-31 11:06:44 · 267 阅读 · 0 评论 -
72. edit-distance
这道题目在大多数公司的笔试题目中都能找到踪迹,以前也遇到过很多这样的情况,其中蕴含的思想在字符串匹配,以及字符串其他操作上使用的非常丰富,而且,最重要的是,这是一类深度优先遍历转换为动归的典型题目。 题目的大致意思是,给定两个字符串,可以通过三种操作变化使两个字符串变为一样,分别是,修改,插入,删除。而总修改次数被称为两个字符串的距离,求出两个字符串变为相同字符串...原创 2018-10-24 12:11:53 · 177 阅读 · 0 评论 -
205. isomorphic-strings
这道题有点技巧性,是一个一一映射的题目。 题目的大体意思是:给定两个字符串,假设每个字符仅有唯一的映射关系,判断这两个字符是否能映射成一样的字符。其实这种问题在密码学中经常遇到,就是我们通过密码本,可以将密文唯一的翻译成明文,也可以将明文唯一的加密成密文。那么,现在给定两个字符串,看这两个字符串是否存在这种映射关系。 解题思路是这样的,两个字符串分别取...原创 2018-10-24 12:29:09 · 136 阅读 · 0 评论 -
212. word-search-ii
这道题乍一看基本的思路就是深度优先遍历,如果根据一个词,遍历一遍整个数据表,那复杂度显然是比较高的,每个词都要遍历一遍二维数组表,而且每个字母要做一次深度优先遍历,这种暴力寻找的做法空间没有浪费,但是时间复杂度太高,起初在做这道题的时候,也没有较好的解决办法。但是想到前面有一个题目字典树的做法,通过空间来换取时间上的高效,因此想到这里,就先对原先的字符串数组构建字典树。 ...原创 2018-10-27 15:28:12 · 146 阅读 · 0 评论 -
327. count-of-range-sum
这道题难度还是挺大的,基本上hard的题目都要费点脑子,根据一般的办法,求和并暴力的复杂度是O(N^2),而题目中明确说O(N^2)是naive,所以,该题目的难点在于如何降低时间复杂度。 题目大意:给定一组数和一个区间,求改组数中所有满足该区间加和的子数组的个数,就是从数组中挑选一组连续的数,如果选出的数之和满足条件,则视为一组有效数,如果不满足条件,则为无...原创 2018-11-03 14:57:33 · 297 阅读 · 0 评论 -
32.longest-valid-parentheses
括号匹配的题目是leetcode一个常见的题型,从easy到hard各种难度都有,其实他可以归在字符串大类之中,既然是字符串题目,不可避免地灵活性就会非常高,同时也增加了解题的难度。 这道题目的大体意思是这样的:给定一个只有左括号"("和右括号")"的字符串,求合法的字符串有多长,合法的意思是说左括号必须出现在右括号的左边的情况视为合法情况,例如:()(), (())...原创 2018-10-17 11:21:42 · 255 阅读 · 0 评论 -
30.substring-with-concatenation-of-all-words
说实在的,这道题还是比较难的,因为没有好的思路,其实从历年各个公司的算法真题来看,难题还是多出现在字符串上,这道题就是比较灵活的一道,没啥太好的思路,起初想着dfs,倒是可以做,但是开销蛮大的,因此,这里我参考大神的代码写了使用hash来解决问题。达到O(N)的时间复杂度和O(N)的空间复杂度。 题目的大意是给定一个字符串和一个字符串对应的数组,在字符串中寻找一...原创 2018-10-16 21:31:56 · 240 阅读 · 0 评论 -
88.merge-sorted-array
这道题目被喷的很惨,而且难度极低,基本上是个人都能做出来,但是我要说的是,一个细节的处理很重要,个人感觉是能反映出一些灵活运用的能力。 题目大体意思是这样的,给定两个从小到大的排序数组,将两个数组归并排序到第一数组里面去,第一个数组中前m个是待排元素,后n个为位置是任意数字,目的是能够放下两个数组。 这道题用常规的归并排序完全可以做,但是,既然题目专门将...原创 2018-10-19 11:20:30 · 91 阅读 · 0 评论 -
289. Game of Life
这道题和前一篇博客的题有一定的相似之处,都是要求处理矩阵,都要进行矩阵的0,1变换,都要在原地完成,空间复杂度是O(1),时间复杂度要求是O(mn),难点就在空间复杂度是O(1)这里,因为要求不能使用更新过的数值去更新以他元素,因此,需要在原表中记录前后两个状态。其实,在矩阵中,每一个位置的数值变化分为有两种状态,变或者不变,独营的,每个位置上的数值也有两种,0或者1,这就使得二维矩阵中的数值...原创 2018-08-30 11:03:17 · 134 阅读 · 0 评论 -
34. Find First and Last Position of Element in Sorted Array
这道题本身没有太大的问题,暴力肯定能解决,给定一个数组,查找的是目标数的起止点,因为是有序数列,最容易想到的是二分法,这样平均的时间复杂度是logN。二分法一般在细节上要注意的地方有两个,一个是整型的舍弃操作,会导致两端指针无法向中间靠拢出现系循环问题,第二个是不要使用两端相加除以二的操作,容易出现越界,最好的办法是,起始点加上终止点减起始点除以二:(start+(end-start)/2)....原创 2018-09-08 12:02:47 · 66 阅读 · 0 评论 -
897. Increasing Order Search Tree
这道题的难度定义是easy,但是,乍一看还是被唬住了的感觉,所以看了看别人的思路,其实就是中序遍历的操作加上指针左指针置空,右指针回指,用一个全局的指针去完成整棵树的重新搭建。直接看代码应该也很容易。class Solution {public: TreeNode* cur = NULL; TreeNode* increasingBST(TreeNode* r...原创 2018-09-08 15:42:48 · 557 阅读 · 0 评论 -
41. First Missing Positive
这道题的难度等级被评定为hard个人感觉不是很合理,因为和它很像的一道题,也是leetcode的,评定为midium,但不管怎么样,这道题目很经典,前几天在给师兄打援的时候,发现了一道原题,具体是那家公司不记得了。但终归代表的是一类经典的题目。这道题的入手点在于缺失的最小正整数,暴力的解决方法就是从1开始,一遍一遍的查找看到底哪个是最小的,时间复杂度是O(n),但事实上,我们可以根据数组中数字...原创 2018-09-08 16:17:43 · 293 阅读 · 0 评论 -
148. Sort List
这道题说实在的挺难的,到现在为止我都不熟练,而且当时真的没有思路,所以,把大神的思路拿来看了看,才略懂一点。题的大意是这样的,对一组无序链表进行排序,我们比较熟悉的是数组排序,现在让用链表排序,确实还挺懵的,刚开始是将链表中所有元素的地址放在一个vector当中,把链表排序当作数组排序,但不符合题目的要求。看了大神的思路,一般有两种,因为是链表,最大的难度在于无法快速定位元素,所以,把链表...原创 2018-09-08 16:48:18 · 160 阅读 · 0 评论 -
713. Subarray Product Less Than K
这道题刚开始觉得没有多难,但真正做的时候,发现很多细节处理还是很见功底的,看了大神的代码,这些细节处理非常到位。这道题是找连续子序列,满足乘积小于给定的一个值,一个长度为2的序列,其子序列有3个,长度为3的子序列,子序列有6个。这块处理确实比较棘手,刚开始我的思路是这样的,用一个left和right 指针来确定当前序列的位置,当乘积超过规定的数值,就将前面序列所有的子序列个数加到对应的数值上,...原创 2018-09-08 17:12:16 · 81 阅读 · 0 评论 -
238. Product of Array Except Self
这道题难点在于不能额外用空间,而且时间复杂度要求是O(n),一般暴力思路就是将除本身以外的数乘起来然后存在一个对应的数中去,因为原数组中的数整个过程都要用到,所以,不能改变原数组的值,也就是要另外开辟空间,这样算下来,暴力方法的时间复杂度是O(n*n),空间复杂度是O(n),不符合题意,所以,要解决时间和空间两个问题。解决空间复杂度问题:原数组不能被破坏,不论怎么样,都需要一个长度为n的数组,...原创 2018-09-08 17:34:19 · 90 阅读 · 0 评论 -
130. Surrounded Regions
这道题可以帮助大家学习一下深搜和广搜,连通性问题,而且是四联通,具体的思路简单,代码比较长,没啥太突出的技巧性。DFS:class Solution {public: void solve(vector<vector<char>>& board) { if (board.empty() || board.size()<2 |...原创 2018-09-08 17:39:08 · 92 阅读 · 0 评论 -
215. Kth Largest Element in an Array
这道题虽然难度不大,而且可以用不同方法解决,但是确实学到了不少东西,尤其是第一次看到了优先级队列这种操作。第一种方法,hash表排序:class Solution {public: int findKthLargest(vector<int>& nums, int k) { if (nums.size()<1 || k>nums....原创 2018-09-08 17:49:50 · 117 阅读 · 0 评论 -
324. Wiggle Sort II
这几天做的题有点多,所以,博客写的有点简单。这道题是要大小数叉开,整个序列将会成为小大间隔开来,如果是我们正常情况下,肯定是选择一个中位数,然后将数组对半分开,小数放在偶数位上,大数放在奇数位上,但这就要求空间复杂度和时间复杂度都要是O(n),而题目要求不能有额外的空间消耗,因此,需要在空间复杂度上来考虑。我们的目的是将小数放在偶数位上,大数放在奇数位上,要做到这一点我们需要两步骤,首先要...原创 2018-09-08 20:24:19 · 388 阅读 · 0 评论 -
862. Shortest Subarray with Sum at Least K
好久没有更新了,这几天主要对hard级别的题目做了一些,今天分享一下862题的解题思路,一般看到这种类型的题目,有两个反应,暴力遍历所有情况,然后选择出最好的,但是这种情况肯定是行不通的,效率是非常低的,而且这种采用加和形式的题目,如果前面加出来的结果不能被后面的计算步骤利用,那将不是一个比较好的结果,因此,在看了大神们的代码后,整理了一下思路。 为了实现O(N)的...原创 2018-09-14 17:00:44 · 122 阅读 · 0 评论 -
priority_queue特性解读
priority_queue是优先级队列的意思,简单理解就是队列带有了优先级的区分,和平常我们看到的队列queue的区别在于,平时的队列元素没有优先之分,先进来的数据先出去,而通常情况下,在一些实际的场景中,队列往往设有优先级之分,这在计算机网络中是非常常见的,举个例子,当一个非常重要的数据进入队列之后,需要快速发出去,就需要让其他数据等待,重要的数据先发出去,这就要求该数据有高于其...原创 2018-09-14 22:18:46 · 1849 阅读 · 0 评论 -
4 median-of-two-sorted-arrays
第四题评级是hard,看似很简单的题目着实没有那么容易做,主要原因在于时间复杂度的要求非常严格,基本上数组的题目,只要已经拍好了顺序,就必须在logN的复杂度下解决,当然后台的检测没有那么严格,O(n)也能通过,而为了而实现logN的复杂度,我也是在网上看了好久的答案,自己手推了一遍,才AC掉。答题的思路是这样的:1、两个有序数组,总共有多少个数已知,这道题的本质就变成了第K个小数是哪个的...原创 2018-10-15 17:42:06 · 147 阅读 · 0 评论 -
45 jump-game-ii
这道题目和以前一道能不能跳到最后一点的题目有比较类似的思路,但是要稍微难一点,因为要求出最小的跳数。题目的大体意思是这样的,给定一个一维数组,数组中每一位上的数字表示从该位置能向后一跳的最远距离是多少(之所以说最远是可以在0~最远值之间任意选择一个合适的数值),问到达最后一个位置所经历的最小跳数。这种题目基本上穷举是肯定不行的,因此,要有一些小的处理技巧。另外,值得注意的是,这道题给出的所有测...原创 2018-10-18 21:58:24 · 231 阅读 · 0 评论 -
10 regular-expression-matching/submissions
这道题其实是一道正则表达式 题目,“.”可以表示任何字母,“*”可以表示对其前面的字母做n次重复,可以看出,最难处理的就是*号,因为按照我们平时的字符串匹配算法,一对一就可以,就算加上“.”也一样,而给整个算法加入更多不确定性的就i是“ * ”,换句话说,我们要对“*”的位置进行讨论。“*”只对其前面的一个字母起作用,换句话说,如果一个字符串中出现了“*”,假设第k位是*,那么如果前k-2个字...原创 2018-10-15 22:41:21 · 101 阅读 · 0 评论 -
25 reverse-nodes-in-k-group
这道题的大意是说,给一个链表,再给一个整型数字K,要实现这个链表每K个数进行一次反转,整条链表反转的题目比较熟悉,但是,一个链表分成好几组进行反转其实大体思路是一样的,但是每组反转结束之后,应该如何变化指针进行下一次反转,这是这道题的重点。按照以前链表反转的思路,我们首先要创建一个头节点,用来记录链表头节点的位置。其次,设置计数值,将每组的头尾节点分别记录,这块要注意,最好要记录每组头节点...原创 2018-10-16 11:32:51 · 99 阅读 · 0 评论 -
321. create-maximum-number
这道题挺好的,有一定的难度,把一般使用的merge排序有了更灵活的应用,也算是开了眼界。而我也是挂在不知道该如何灵活使用merge排序上了。 题目大意是:给定两个数组,分别表示两个数字,比如,给定要给数组中有两个元素,2,1,表示的是:21,就这个意思。在每个数组各个数字相对位置不变的情况下,挑选固定数量的数字组成一个新的数字,要求这个数字是最大的。 ...原创 2018-11-02 22:27:05 · 186 阅读 · 0 评论