LeetCode
Wenlong_L
这个作者很懒,什么都没留下…
展开
-
leetCode(two-sum)-数组中两个数的和等于目标值
题目:给定一个数组,求数组中的两个数之和等于目标值,返回两个数的索引。方法:使用HashMap维护值与索引的关系扩展:如果不是获取索引,而是获取数值,可以使用:1、HashSet维护数值2、排序后的双指针法(一首一尾)...原创 2019-04-27 17:26:04 · 754 阅读 · 0 评论 -
leetCode(merge-k-sorted-lists)-合并k个排序链表
题目:给定一个排序链表的集合,将其按照顺序排列成一个单链表,返回新的头指针。思路:和上一篇博客中的合并两个排序链表思路是一样的,循环从集合中取新的链表,将上次排好序的链表作为链表1,当前取得新的链表作为链表2,采取相同的方法进行merge,就可以了,在上一篇博客的基础上只是增加了一层外围循环。...原创 2019-05-14 21:14:05 · 250 阅读 · 0 评论 -
leetCode(merge-intervals)-合并区间
题目:给定保存一些区间的集合,将区间合并后加入到集合中输出eg:Given[1,3],[2,6],[8,10],[15,18],return[1,6],[8,10],[15,18].思路:将给定的区间按照区间的最小值进行排序,从第一个区间开始,如果两个区间有重合需要合并,那么第一个区间的最大值大于等于第二个区间的最小值,此时将合并后的区间加入到容器中,并更新第一个区间为合并之后的...原创 2019-05-14 22:02:16 · 179 阅读 · 0 评论 -
leetCode(merge-sorted-array)-合并两个排序数组
题目:给定两个排序数组,将他们进行合并,假设第一个数组空间足够容纳两个数组。思路:使用双指针,为了防止数组整体向后移动,可以将指针设置的从后向前遍历,index初始值是两个数组长度之和。...原创 2019-05-14 22:07:03 · 379 阅读 · 0 评论 -
leetCode(trapping-rain-water)-数组最多能装多少水
题目:给定一个数组,数组中的每一个元素代表一个高度,问由数组中的元素组成的桶总共能装多少水。Given[0,1,0,2,1,0,1,3,2,1,2,1], return6.思路:与前面数组容器最多能装多少水采用类似的方法,双指针一头一尾遍历一遍,每次移动短板,在移动短板的过程中记录下当前边的最大高度,当前高度与最大高度的差值就是结果要加的水量。...原创 2019-05-20 10:28:44 · 907 阅读 · 0 评论 -
leetCode(remove-duplicates-from-sorted-array)-去除排序数组中重复的数据
题目:给定一个排序数组,将排序数组中的重复数据去除,并返回去重后的数组中元素的个数解法一:看到去重就想到了Set(元素唯一),最终的元素要排序,排除HashSet(无序),最后选择TreeSet。需要额外辅助o(n)空间。解法二:采用一个全局的索引,利用排序这一个特性,比较相邻的元素,相邻元素不相同的才加到数组中,不需要辅助空间。...原创 2019-05-07 19:06:23 · 171 阅读 · 0 评论 -
leetCode(add-two-numbers)-链表相加
题目:给定两个链表,链表倒序存储着一个整数值,将两个链表存储的整数进行相加,输出表示结果的链表,链表还是倒序存储相加之后的结果。eg:2->4->3 + 5->6->4 = 7->0->8思路:倒序存储,刚好满足从低位向高位依次相加的加法法则,从链表的第一个元素依次遍历相加,考虑进位。...原创 2019-05-07 20:40:06 · 163 阅读 · 0 评论 -
leetCode(longest-common-prefix)-最长的公共前缀
题目:给定一个字符串数组,求出字符串数组中最长的公共前缀思路:以最短的字符串为基准进行两重循环,外围循环是从第一个字符开始每次遍历一个字符,内层循环是每次一个字符串,只要有一个字符串的当前字符与基准字符不相同就提前结束循环,返回结果。...原创 2019-05-10 19:48:35 · 181 阅读 · 0 评论 -
leetCode(wildcard-matching)-通配符匹配
题目:将字符串与模式进行通配符匹配。'?'通配符可以匹配任意一个字符'*'通配符可以匹配任意字符串,包括空思路:解法一:和前面正则表达式的思路一样,采用递归的形式逐个字符进行匹配,但是在系统中此方法最终超时了,对于非常长的字符串时间复杂度太高。解法二:采用动态规划,可以使用一个二维的动态规划,动态规划的表达式:assist[i][j]表示字符串中以第i个字符结尾的子串与通配...原创 2019-05-20 22:22:52 · 261 阅读 · 0 评论 -
leetCode(letter-combinations-of-a-phone-number)-数字对应的字符串排列
题目:如上,给定一个包含2-9包含数字的字符串,返回所有可能表示的字母组合。数字到字母的映射(就像电话上的按钮一样)如下所示。注意,1没有映射到任何字母。思路:解法一:进行全排列,找出所有可能的排列数,不过条件是每个数字代表的字符串中选择其中的一个字符,递归在每个数字代表的字符串中选择一个字符,返回所有可能的结果。(典型的dfs深度优先搜索的应用)解法二:使用一个队列存储拼...原创 2019-05-10 22:23:02 · 298 阅读 · 0 评论 -
leetCode(generate-parentheses)-产生括号序列
题目:输入一个整数n,输出所有的括号组合,n组括号的组合。eg:For example, givenn= 3, a solution set is:[ "((()))", "(()())", "(())()", "()(())", "()()()"]思路:将当前的左括号数与右括号数组合成(x, y)的形式,将其看成是图的一个节点,如果当前结点的x &...原创 2019-05-17 11:08:20 · 322 阅读 · 0 评论 -
红黑树的java实现
一、红黑树比较重要的特性1、红黑树每个节点要么是黑色、要么是红色2、根节点是黑色3、红色节点的所有儿子都是黑色节点(也就是说从根节点到叶子结点的路径上不能出现连续的红色节点)4、从根节点到叶子结点的每一条路径上拥有相同的黑色节点个数n个节点的红黑树的最大深度不超过2log(n+1),其首先是一颗查找树,其次是平衡树的一个变种。其具有o(logn)的插入删除操作复杂度,操作性能比...原创 2019-05-22 22:07:51 · 232 阅读 · 0 评论 -
leetCode(divide-two-integers)-不用除法求商
题目:不使用除法、乘法、求模去求取两个数的整数除。思路:采用减法来模拟除法,每次减去除数,结果加一。但是这样时间复杂度太大,可以将减去的值设置为一个基数,每次翻倍这个值,那么结果也在原来的基础上进行翻倍。这样时间复杂度会减少,就类比做累乘时可以折半的思想是一样的。...原创 2019-05-17 20:35:39 · 714 阅读 · 0 评论 -
leetCode(search-for-a-range)-查找目标值的范围
题目:在一个排序数组中查找一个目标值所在的范围,时间复杂度为o(logn)。思路:解法一:采用标准的二分查找找到目标元素的位置,再在目标元素所在的位置向两边搜索,确定范围。此方式的时间复杂度为o(logn) + o(n) = o(n),不满足时间复杂度的要求。解法二:采用变种的二分查找直接确定目标值第一次出现的位置,这样逻辑上中间值大于等于目标值时都要在左边继续查找,不管最终是否找到,...原创 2019-05-17 21:33:50 · 491 阅读 · 0 评论 -
leetCode(sudoku-solver)-填充数独
题目:给定一个9*9数独矩阵,里面已经填充了一些值,需要进一步进行填充的值用'.'代表,写一个函数将数独填充完整。思路:解决的是矩阵问题,可以使用DFS+回溯的方式,在填充当前格时从1到9中随便选择一个数进行填充,再DFS深搜接下来的邻接点,如果没有成功则进行回溯重新选择。解决矩阵类的问题都可以采用这一种方式进行解题。...原创 2019-05-19 21:36:41 · 314 阅读 · 0 评论 -
leetCode(merge-two-sorted-lists)-合并两个排好序的链表
题目:给定两个排好序的链表,合并两个链表,使最终的链表也有序,返回新的头节点。思路:这就是链表归并排序中的一个步骤(merge),比较简单,定义两个指针,依次遍历,为了从第一个节点开始,定义一个虚拟头节点。...原创 2019-05-14 20:46:55 · 300 阅读 · 0 评论 -
leetCode(median-of-two-sorted-arrays)-两个排序数组中的中间值
题目:给定两个排序数组,返回两个排序数组中的中间值eg:A[1, 3, 5] B[2, 4] 返回3 A[1, 3, 5] B[2, 4, 6] 返回3.5解法一:因为两个数组已经排好序,可以直接使用归并排序中的merge的思想采取双指针解法二:有一个一般的解决思路,在两个排序数组中找到第k个数,在这里k取中间的一个数(总长度为奇数的情况)...原创 2019-04-28 10:52:36 · 469 阅读 · 0 评论 -
leetCode(container-with-most-water)-盛水容器最多可以装多少水
题目:给定一个数组,数组中的每一个元素代表一个高度,用其中的两个元素组成容器的两条边高,两个元素的间隔为底长,求这个容器的最大盛水量。解法一:暴力枚举,列举所有的可能性,求出其中的最大值,时间复杂度0(n*n)解法二:利用短板效应提前过滤掉很多的可能性,减少枚举次数,思想是边从两边向中间夹,每次只移动较短的边,因为较长的边向中间移动得到的体积不会变得更大(短板效应与公共边效应决定),所以这...原创 2019-04-28 14:20:07 · 246 阅读 · 0 评论 -
leetCode(longest-substring-without-repeating-characters)-最长不重复子串
题目:给定一个字符串,找到该字符串中最长的不重复字串,并输出其长度。思路:解法一:可以枚举排列该字符串的所有字串,找到其中最长的。解法二:使用HashMap保存已经遍历过的字符的索引,维护一个start,采用一次遍历的方式找出最长的子串解法三:由于考虑到解法二中的HashMap中的key是字符,可以直接简化HashMap为一个256长度的数组,字符的ascii码作为key,这样可以...原创 2019-05-08 10:07:49 · 152 阅读 · 0 评论 -
leetCode(3sum)-三数之和为目标值
题目:在数组中找出所有的三个数,这三个数之和恰好是0,返回所有的非重复组合解法一:最容易想到的,暴力枚举,三维三重循环(时间复杂度太高,超时)解法二:使用HashSet保存,将三重循环降维为两重循环,牺牲空间换时间(也超时,不知道为什么)解法三:排序后的双指针法,与二数之和类似,这里三个数只是多了一维...原创 2019-05-06 09:31:49 · 802 阅读 · 0 评论 -
leetCode(longest-palindromic-substring)-最长回文字串
题目:给定一个字符串,输出这个字符串的最长回文子串思路:解法一:可以蛮力枚举所有的字串,看其是否是回文子串(枚举时间复杂度是o(n*n),最终超时)解法二:只遍历一遍,以当前遍历的字符为中心向两边扩展找最长回文子串,时间复杂度o(n)-o(n*n)(可以运行通过)...原创 2019-05-08 20:13:38 · 184 阅读 · 0 评论 -
leetCode(reverse-integer)-反转整数
-题目:给定一个整数,将整数进行反转,如果反转后的整数溢出则返回0,输入的整数有可能前面带负号,反转后整数前面的0要去掉eg:123 ---> 321 -123 --> -321 -100 --> -1解法:在原始数据中从最低位个位开始分离,组装新的数据,负数求模与求余结果都带有负号,自然解决了符号问题。...原创 2019-05-08 20:42:24 · 269 阅读 · 0 评论 -
leetCode(regular-expression-matching)-正则匹配
题目:输入两个字符串,一个是待匹配的字符串,一个是匹配模式,看二者是否匹配,模式中‘.’匹配任意一个字符,'*'表示前面的模式重复0次或多次。思路:采用递归,比较完当前字符,当前字符要是匹配成功,递归匹配接下来的字符(要考虑下一个字符是'*'的情况下,要考虑当前字符是匹配零次还是匹配多次),当前字符要是匹配失败(下一个字符如果是'*',则考虑当前字符匹配0次,否则直接匹配失败)...原创 2019-05-08 21:45:57 · 155 阅读 · 0 评论 -
leetCode(roman-to-integer)-罗马数转化为整数
题目:给定一个罗马数,将其转化为整数并进行输出。例如,2在罗马数字中被写成II,就是两个加在一起。12是写成,XII,也就是X+II。数字二十七是二十七,也就是XX+V+II。罗马数字通常从左到右写得最大。然而,4的数字不是IIII。相反,数字4被写成IV,因为1在5之前减去它等于4。同样的原则也适用于9号,它被写成IX。有六种情况下使用减法:I可以在V(5)和X(10)之前放置分别是...原创 2019-05-08 22:18:58 · 233 阅读 · 0 评论 -
leetCode(remove-nth-node-from-end-of-list)-删除单链表中倒数第n个节点
题目:给定一个单链表,删除链表中的倒数第n个节点,返回头节点思路:由于是单向链表,要想只遍历一次进行链表节点的定位,一般使用快慢指针,在这里的快慢指针,一个先走n+1步,然后两个同时移动,当快指针为null时,慢指针刚好指向要删除的节点的前一个节点,此时只用改变这个节点的next指针,跳过要删除的节点即可。由于考虑到删除的节点可能是头节点的情况,删除的是头节点,此时就没有前缀节点了,所以顺...原创 2019-05-13 20:34:14 · 490 阅读 · 0 评论 -
leetCode(4sum)-四数之和为目标值
题目:给定一个数组,在数组中找到所有四个数,使得四个数的和为目标值思路:与3sum思路一样,只是增加了一维,也就是多了一层循环,注意可以采取一些小技巧将一些冗余代码跳过,也就是可以排除太大的数和太小的数。整体采用排序+首尾指针+去重...原创 2019-05-06 14:11:53 · 302 阅读 · 0 评论 -
leetCode(valid-parentheses)-判断括号的合法性
题目:给定一个字符串,字符串中只可能含有'('、')'、'['、']'、’{‘、'}'这些字符,如果括号可以配对,返回true,否则返回false;Example 1:Input: "()"Output: trueExample 2:Input: "()[]{}"Output: trueExample 3:Input: "(]"Output: false...原创 2019-05-13 22:29:07 · 491 阅读 · 0 评论 -
leetCode(integer-to-roman)-整数转化为罗马数字表示
题目:给定一个整数,输出其罗马数字表示,整数的范围在1-3999之间。Symbol ValueI 1V 5X 10L 50C 100D 500M 1000例如,2在罗马数字中被写成II,就是两个加...原创 2019-05-09 10:51:24 · 232 阅读 · 0 评论 -
leetCode(valid-sudoku)-有效的数独
题目:给定一个9*9的数独矩阵,判断该数独矩阵格式是否正确,不管该数独是否有解。思路:一个9*9的数独的格式正确的条件是三个方面:1、每一行的数字都不重复2、每一列的数字都不重复3、每一个块的数字都不重复构造三个二位数组分别记录每一行、每一列、每一个块数字的出现情况,出现的数字位置置为true,如果再次出现就可以判断了。...原创 2019-05-19 20:11:38 · 409 阅读 · 0 评论 -
leetCode(search-in-rotated-sorted-array)-在一个旋转排序数组中查找目标值
题目:给定一个从中间某一位置翻转的排序数组,在该数组中查找目标值。思路:首先判断排序数组是否翻转,如果没有翻转,直接使用二分查找,如果翻转,先使用变种的二分查找找到翻转位置,再分别在前半段与后半段进行二分查找寻找目标值。、...原创 2019-05-17 22:21:53 · 605 阅读 · 0 评论