
欠练的题目
文章平均质量分 54
千念飞羽
这个作者很懒,什么都没留下…
展开
-
leetcode-81. Search in Rotated Sorted Array II
leetcode-81. Search in Rotated Sorted Array II题目:但是这题有可重复问题的限制。那么会出现一个问题比如说13111这样的情况,左节点右节点和中间节点都是一样的。泛化的说就是无法判断到底是左半部分和右半部分到底哪个是规则的。之所以出现这样的情况。就是因为对于平台区同时存在于左半部分和右半部分,那如何解决这个问题呢我用的方法就是当左节点和右节点相等的时候移动左或右原创 2016-12-20 16:57:37 · 415 阅读 · 0 评论 -
leetcode-75. Sort Colors
leetcode-75. Sort Colors题目: 这题的思路很简单,先二分排列找到0和非0,然后在二分找到1,2。原创 2016-12-18 21:59:56 · 274 阅读 · 0 评论 -
leetcode-74. Search a 2D Matrix
leetcode-74. Search a 2D Matrix题目: 这题有一个可以利用的地方,就是它是从小到大Z字形排列的。所以可以无视格式直接按照普通的二分搜索来做。我自己写的时候是按照行和列分别搜索,总之写的很复杂。这个是仿造讨论写的原创 2016-12-18 21:57:28 · 306 阅读 · 0 评论 -
leetcode-73. Set Matrix Zeroes
leetcode-73. Set Matrix Zeroes题目: 这里的思路是先从左上到右下遍历,将所有需要需要置零的行和列的首位都置为0,然后再反向遍历将所有首位为0的行和列都置为0。这里还用一个值来表示首行是否需要置零。这也是为什么需要反向的原因。这个设计的非常漂亮。反正我是没想到。原创 2016-12-18 21:49:26 · 871 阅读 · 0 评论 -
leetcode-89. Gray Code
leetcode-89. Gray Code题目:技巧题原创 2016-12-22 11:07:34 · 312 阅读 · 0 评论 -
leetcode-87. Scramble String
leetcode-87. Scramble String题目:这里的基本方法就是累积字符数量,然后对不同的位置做切分去找有没有满足条件的,如果有则直接返回。从方法上来说其实综合了动态规划,hash表和DFT的方法是很好的综合性题目原创 2016-12-22 11:04:37 · 362 阅读 · 0 评论 -
leetcode-85. Maximal Rectangle
leetcode-85. Maximal Rectangle题目: 针对每一个点计算从该点看到的最左边和最右边的边缘以及高度,这样()右边-左边)*高度就是面积。对每个点算面积就可以得到结果。问题在于如果计算从每个点看到的最大矩形。 这里使用动态规划的方法,维护三个变量数组,以第一行为基础,计算到最后一行。原创 2016-12-22 10:58:03 · 476 阅读 · 0 评论 -
leetcode-84. Largest Rectangle in Histogram
leetcode-84. Largest Rectangle in Histogram题目: 这里显然的方法是用栈。问题在于栈里是数据存放什么?栈里存放的数据应该是坐标。是比当前的坐标所指定的高度小的前一个i的坐标。因为计算面积时需要按照最小的坐标来算。因此只需要考虑比当前i小的坐标就好。如果当前的坐标比之前的所有的坐标都大,那只需要将当前的坐标压入栈,如果当前坐标比栈顶坐标小则开始算计。原创 2016-12-22 10:46:14 · 419 阅读 · 0 评论 -
leetcode-61. Rotate List
leetcode-61. Rotate List题目: 思路大致如下: 首先创立一个哑节点,然后建立两个指针都指向这个哑节点,然后维护两个整型常量,一个维护当前两个指针之间的距离,一个记录整个列表的节点数量。 然后移动r节点,直到两节点之间的距离为k,然后同时移动两个节点,直到右节点到达尾部。 然后判断两指针之间的距离是否为k,如果为k则说明列表的长度大于k,进行指针指向调整,如果不等于,则说明列表长度小于原创 2016-12-09 10:08:22 · 253 阅读 · 0 评论 -
leetcode-60. Permutation Sequence
leetcode-60. Permutation Sequence题目:这题的思路试这样的首先你要判断第一个排列是多少?比如3排列,那他开头的选择有3种,每种有两个,推广来说就是对于n排列,第一个数有n中选择,每种选择的数量是(n-1)!个排列数量。然后在判断第二个,依次类推。但是这里还有一个问题需要解释一下。就是为什么要建list然后把1-n的数按顺序插入进去,这个时机上是判断还有那些数待排序。例如你要原创 2016-12-09 09:59:24 · 252 阅读 · 0 评论 -
leetcode-76. Minimum Window Substring
leetcode-76. Minimum Window Substring题目L: 说起来比较简单但是实现的过程确比较复杂。而且目前应该也不是最简过程。 首先我先建立一个HashMap表,并累计所有t中的值,然后初始化窗口,如果遍历整s都没有找到合适的窗口则返回""; 然后维护这个窗函数,不断向右移动左窗口,直到其窗口右边达到右边,寻找在此过程中的最小窗口。 返回最小的窗口原创 2016-12-18 22:14:22 · 385 阅读 · 0 评论 -
leetcode-91. Decode Ways
leetcode-91. Decode Ways题目:做这题的时候我忘记考虑一个问题:比如222,这种情况实际上只有[2,2,2][2,22][22,2]这三种情况,我最开始判断的时候实际上是按照当前的i的数字和i+1的数字来判断的只要是10-26之间都判断c=c*2,这样就是2*2所以是4个。判断出错。所以这里实际上要加一个flag来维护i-1的情况原创 2016-12-26 09:32:35 · 380 阅读 · 0 评论 -
leetcode-124. Binary Tree Maximum Path Sum
leetcode-124. Binary Tree Maximum Path Sum题目:这题显然是需要迭代的,但是每次迭代中却需要进行很多次比较,所以对于结果我使用了域。针对一个节点需要比较这几个,其左子节点对应的最大值,其右子节点对应的最大值,其从左子节点-根节点-右节点之和,其从左子节点-根节点之和,其根节点-右节点之和,以及ret。这几个值之间的最大值。原创 2017-01-04 17:15:19 · 439 阅读 · 0 评论 -
leetcode-123. Best Time to Buy and Sell Stock III
leetcode-123. Best Time to Buy and Sell Stock III题目:和前2题不同,这里需要计算的是最多两次交易,而且要求不能同时拥有两个股票。这题思路就是分治算法,从0到i天之内。每一天都可以将这段时间分割成为两个时间段,然后去求其最大值之和就好。但是这里并不是简单的分治算法,因为两个问题不是是独立的,我们要求的是和。这里不去思考最大2次交易而是来看最大k次交易。>原创 2017-01-04 17:10:57 · 433 阅读 · 0 评论 -
leetcode-115. Distinct Subsequences
leetcode-115. Distinct Subsequences题目: Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence of a string is a new string which is formed from the or原创 2017-01-04 16:46:19 · 468 阅读 · 0 评论 -
leetcode-106. Construct Binary Tree from Inorder and Postorder Traversal
leetcode-106. Construct Binary Tree from Inorder and Postorder Traversal题目: Given inorder and postorder traversal of a tree, construct the binary tree You may assume that duplicates do not exist i原创 2017-01-04 16:18:13 · 311 阅读 · 0 评论 -
leetcode-105. Construct Binary Tree from Preorder and Inorder Traversal
leetcode-105. Construct Binary Tree from Preorder and Inorder Traversal题目:基本的数据结构知识知道,如果想要恢复一颗数,至少需要这三个遍历中的两个,而且至少有一个为中序遍历,道理很简单就是因为中序遍历其实其跟将树一分为2,所以我们只需要根据前序或者后序遍历终根的位置,在中序遍历终找根的位置就好了。所以这里假设没有重复节点,如果有重复节点的话我还原创 2017-01-04 16:16:52 · 365 阅读 · 0 评论 -
leetcode-99. Recover Binary Search Tree
leetcode-99. Recover Binary Search Tree题目第二遍刷还是没想起来,这其实是非常漂亮的解法,BST如果先序遍历肯定是递增数列,那么我们的问题就在找到一串递增序列中的2个逆序的位置,然后用指针保存这两个值进行交换。但是一开始确实不容易想到。原创 2016-12-26 10:11:46 · 455 阅读 · 0 评论 -
leetcode-98. Validate Binary Search Tree
leetcode-98. Validate Binary Search Tree题目:这题本身思路很简单,但是有一个问题我始终解决不了就是当节点是Integer.MIN_VALUE或者Integer.MAX_VALUE的时候。当时做的时候错了很多次,后来看答案才发现原来题目用的是long- -。。确实用long就没有这种问题了。如果在int范围内还是要做很多复杂的判断的。确实是一种典型的解决Integer范围问题原创 2016-12-26 10:08:42 · 392 阅读 · 0 评论 -
leetcode-95. Unique Binary Search Trees II
leetcode-95. Unique Binary Search Trees II题目:这题第二遍做还是没做出来,我总是想怎么用动态规划区解,主要还是偷看了tag。想在n-1的基础上找n很久都没找到。这里实际上并不能算是DP算法。应该还是DFS方法或者分治算法。思路就是针对1-n之间的每个i去找其左子节点和右子节点,分别形成TreeNode数组然后在数组里的互相匹配构成上一层的数组。算法设计的非常漂亮。原创 2016-12-26 09:53:23 · 601 阅读 · 0 评论 -
leetcode-93. Restore IP Addresses
leetcode-93. Restore IP Addresses题目:这里是典型的回溯法,但是这里有一个有意思的情况就是对于0的处理,因为Integer.parseInt在处理00字符串的时候会处理成0,所以需要在解析之前把00的情况排除掉。这个在提交之前没有注意这个问题。原创 2016-12-26 09:40:47 · 511 阅读 · 0 评论 -
leetcode-37. Sudoku Solver
leetcode-37. Sudoku Solver题目: 刚拿到这题的时候说实话觉得挺简单的,应该标为中等题才对,后来做的时候确没写出来。。这里有一个小的思路问题,如果回溯法理解的不是很清楚的话会出问题。 其实后来再看比较简单,这里实际上应该写为三部分,也就是不能直接在solveSudoku里面直接写循环。关键在于回溯法和DFS有一些差异,如果是DFS的话肯定是可以直接写循环的。但是回溯法需要将整个图都原创 2016-11-26 16:26:53 · 468 阅读 · 0 评论 -
leetcode-36. Valid Sudoku
leetcode-36. Valid Sudoku题目: 一开始没明白题目的意思,按照讨论的意思来看只要判断一下每一行,每一列和每一个3*3小方格是不是有重复的数就行,其实这样做似乎并不能保证一定有解法。后来自己写的时候发现还是很麻烦的,尤其是最后3*3的小方格比较难判断。要是让我做的话我只有建9个hashset之类的了。后来在讨论区看到一个非常漂亮的答案。 这个答案的基本思路就是虽然也是迭代i和j但原创 2016-11-25 10:49:41 · 438 阅读 · 0 评论 -
leetcode-48. Rotate Image
leetcode-48. Rotate Image题目: 要求要做原地变换。这里其实需要找规律,如果一个一个移动的话虽然理论上可以,但是实在太复杂了。 - 顺时针旋转: - 先沿着对角线翻转,然后在竖直方向翻转一下就可以了。 - 逆时针旋转: - 先竖直方向翻转,然后在沿着对角线反正一下就可以了。原创 2016-12-04 21:32:53 · 293 阅读 · 0 评论 -
leetcode-22. Generate Parentheses
leetcode-22. Generate Parentheses题目:基本思路就是剩余左括号和右括号的顺序,只要注意右括号不能比做多就行了,虽然标记是回溯法,但是个人觉得用java来写,更像DFS。。毕竟String是final类。。多练练题还是好的,第一次做这题的时候想了很多,刷第二遍leetcode的时候很快就做出来了。原创 2016-11-21 14:39:13 · 292 阅读 · 0 评论 -
leetcode-23. Merge k Sorted Lists
leetcode-23. Merge k Sorted Lists常规思路n*kn*logk的mergesort和堆解法原创 2016-11-21 14:59:00 · 298 阅读 · 0 评论 -
leetcode-47. Permutations II
leetcode-47. Permutations II题目: 主要要解决两个问题: 第一个问题是如何排序,总的来说常规的思路,就是建一个list,然后不断的加不同位置的值进去。并且在不同的迭代层次插入和删除元素,完成回溯。这也是java比较好实现的一种典型的回溯法。但是就这题来说其实也可以使用交换数组中固定元素的方式来遍历。但是这里有个无关算法的小trick,就是Arrays.asList(int[])类型原创 2016-12-03 11:09:26 · 328 阅读 · 0 评论 -
leetcode-46. Permutations
leetcode-46. Permutations题目:这一题的基本思路就是典型的回溯法。但是问题是怎么去查询下一层迭代。基本的方法就是每次加入不同的pos位置,然后如果List本身包含了这个pos的值则说明已经加入过了。当然这是针对这题的,如果是有重复值的话就比较麻烦了。目前的思路和之前一题有类似的情况,就是先排序然后判断当前pos和pos-1是否一致来跳过相同的加入。这样的思路行不行。不过这个我没写过了。以原创 2016-12-01 19:48:33 · 356 阅读 · 0 评论 -
leetcode-45. Jump Game II
leetcode-45. Jump Game II题目:从最简单的想法来看,就是维护2个nums.length的数组,一个填当前位置可以到达的最远的距离,一个填当前位置的最小跳数。但是这样的话就需要O(n^2)的复杂度(我觉得好像是。因为虽然搜索范围是nums.length*nums[i]但是实际上nums[]的范围是有限的所以应该是n^2)后来看过答案才明白,应该以每次增长为一个循环层次,然后迭代本次跳跃原创 2016-12-01 19:38:46 · 251 阅读 · 0 评论 -
leetcode-4. Median of Two Sorted Arrays
leetcode-4. Median of Two Sorted Arrays刚拿到这题的时候题目理解错了。主要难点在于要求log(m+n)这点实现起来比较困难一些,类似这样的时间复杂度要求,其实都需要分治或二分之类的方法去做,否则肯定是没办法达到要求的。这里就是借鉴了二分的思路。既然两个输入的数组都是排序的。找中位数,其实就可以泛化为找第(m+n)/2个最小的数。每次比较两个数组的第k/2个。如果原创 2016-11-15 15:27:28 · 334 阅读 · 0 评论 -
leetcode-41. First Missing Positive
leetcode-41. First Missing Positive题目:这题确实一道比较难的题,不过有的人可能看起来比较简单,反正我是看了答案才明白的。基本思路就是把i放到i-1的位置上,如果当前i-1位置上的值不对就不停的交换,直到i-1位置上的值是i就行或者i-1的位置不符合标准。原答案写的麻烦一些。我这里重写了一下原创 2016-11-30 16:32:44 · 315 阅读 · 0 评论 -
leetcode-40. Combination Sum II
leetcode-40. Combination Sum II题目:相对于上一题,这题要麻烦一些。但是基本上还是常规思路。主要就是两点:- 第一点是每个candidate数组中的取值只能取一个,这样在helper里面进行下一层pos的取值的时候就需要是i+1而不是i。- 第二点就是candidate内部有可能有重复的值,这样就需要排除重复取值的情况,也就是如给出的例子,1,2,5可能重复取两边,所以在进行下原创 2016-11-30 16:28:28 · 298 阅读 · 0 评论 -
leetcode-49. Group Anagrams
leetcode-49. Group Anagrams题目:这题本身并没有什么特别灵巧的算法。但是这里需要说明一下。java里面hash算法如果自己没有重写hash的话,基本上是根据对象来分的,就算是内容一样不是同一个对象也会有不同的hash值。但是String之类的是除外的,因为String实际上在hashmap里有一套专门的散列方式。因为按照常规的散列方式安全性太低了。原创 2016-12-04 21:42:17 · 273 阅读 · 0 评论 -
leetcode-29. Divide Two Integers
leetcode-29. Divide Two Integers题目: Divide two integers without using multiplication, division and mod operator.第二遍做的时候还是没想起来。。其实就是二分法。但是跟一般的二分有点不一样。里面要嵌套一个while保证除数以2的幂的速度增长。这样先找结果的最高位,在找次高位以此类推。直到原创 2016-11-23 14:40:35 · 268 阅读 · 0 评论 -
leetcode-69. Sqrt(x)
leetcode-69. Sqrt(x)题目: 基本思路就是2分法。但是需要考虑一下,如果x的开根号之后不是整数的情况。这中情况下就找离结果最近的数,可以利用mid==i或者mid==j来判断。另外需要对1做单独处理原创 2016-12-13 22:12:49 · 253 阅读 · 0 评论 -
leetcode-68. Text Justification
leetcode-68. Text Justification题目: 从思路上说这个代码主要分为3个部分。 第一部分判断当前行可以容纳多少个词组 第二部分判断插入多少个空格剩余多少个空格 第三部分加入list结果中。原创 2016-12-13 22:05:25 · 302 阅读 · 0 评论 -
leetcode-57. Insert Interval
leetcode-57. Insert Interval题目: 首先这题整体上思路是这样的: 先考虑插入问题,在考虑融合问题。说起来比较简单但是做起来比较麻烦。首先插入除了需要考虑正常的中间某个i坐标插入以外还需要考虑,空集的情况以及在末尾插入的情况。在插入后还需要保留当前插入的坐标,以减少时间复杂度其次融合问题。需要考虑两个方向上的融合,而且先向后融合然后向前融合比较方便。融合的生活还需注意一点是有时原创 2016-12-07 11:00:03 · 285 阅读 · 0 评论 -
leetcode-33. Search in Rotated Sorted Array
leetcode-33. Search in Rotated Sorted Array题目:这里基本思想就是二分法,而二分法其实并不需要严格排序,比如这一题,由于是Rotated,所以如果将数组二分的话至少会有一半是严格二分的,又因为不存在重复元素,我们只要判断严格递增区域的是否包含target就好了。如果严格递增区域没有则必定在另一半。 当然corner case还是有点麻烦的。。需要认真判断一下。这里原创 2016-11-24 15:34:41 · 344 阅读 · 0 评论 -
leetcode-31. Next Permutation
leetcod-31. Next Permutation题目: 首先,找下一个排序,首先应该找低位的逆排序,因为排序都是从尾部开始变化排序的,也就是对应文中的从右往左找第一个相邻的增长2长度字节first和second。如果找到了就是普通的情况继续下一步,如果没找到则说明整个数组都是逆序的,那这样的情况下一个排序就是将整个数组翻转过来,也就是第三步。 其次,找到当前需要进行转换的位置,那么下一步需要找的就原创 2016-11-24 15:09:30 · 357 阅读 · 0 评论 -
leetcode-32. Longest Valid Parentheses
leetcode-32. Longest Valid Parentheses - 如果是左括号就将当前位置压人栈, - 如果是右括号就判断当前栈是否为空, - 如果是空则说明之前数据违法了,那就从当前位置开始判断之后的括号是否有效。 - 如果不是则抛出一个左括号与当前指针的右括号相消,这时在判断栈是否为空。 - 如果这时栈为空了,则说明以当前的left为节点的区域已经判断完毕。原创 2016-11-24 15:26:52 · 415 阅读 · 0 评论