leetcode
绝世好阿狸
这个作者很懒,什么都没留下…
展开
-
【Leetcode】142. Linked List Cycle II
题目:https://leetcode.com/problems/linked-list-cycle-ii/#/description返回链表中的环的第一个元素,如果没有返回null。检测是否有环,利用双指针一快一慢即可。如果要返回环,需要一些数学计算。假设环大小为r,相遇点为n2,环点为n1,起点为n0。相遇时,快指针路程为df,慢为ds。则有:df - ds = kr,2d原创 2017-03-16 04:09:47 · 357 阅读 · 0 评论 -
【Leetcode】45,55 Jump game
先看55:https://leetcode.com/problems/jump-game/#/description数组的每一个元素代表在该位置能跳跃的最大步数,问能否从位置0到末位置。一个简单的思路是遍历每一个位置,然后用每一个步数更新所能到达的每一个下一个位置。假设最大步数是s,那么复杂度是Oxn。特别是当x很大时,效率比较低。更好的思路:充分利用“最大距离”。每一次都计算原创 2017-03-15 06:10:58 · 357 阅读 · 0 评论 -
【数据结构与算法】根据遍历结果构建二叉树
对于普通的二叉树,已知遍历结果,如果想唯一确定二叉树,那么必须知道中根遍历,再加上先根后者后根的一种。如果能够划分出序列中的左子树和右子树,那么就可以构建二叉树。知道先根或者后根,就可以知道根,然后再在中根遍历的结果中找出根,那么左边就是左子树,右边就是右子树。对于BST,只需要知道先根或者后根就可以确定,或者说只需要知道根就可以确定,利用左子树比根小,右子树比根大的特性就可以划分原创 2017-03-14 11:22:17 · 781 阅读 · 0 评论 -
【Leetcode】451. Sort Characters By Frequency
题目:https://leetcode.com/problems/sort-characters-by-frequency/#/description特殊的排序,对频率排序。1.常规思路,先遍历一遍,把频数存入map,再把map的entry存入priorityqueue,最后逐一出队即可。代码:public String frequencySort1(String s) {原创 2017-03-13 07:52:58 · 342 阅读 · 0 评论 -
【Leetcode】171. Excel Sheet Column Number,168. Excel Sheet Column Title
171题目:https://leetcode.com/problems/excel-sheet-column-number/?tab=Description给定一个string,转换成数字。类似于多进制之间的互转,但是有一点不同,这里是从1开始的,即A对应1.而一般的多进制,都会对应到0.这是一点需要注意的。思路就是从string的右端向左端遍历,假设现在是c,然后计算出c代表的数字,原创 2017-03-13 05:12:11 · 263 阅读 · 0 评论 -
【Leetcode】33. Search in Rotated Sorted Array
https://leetcode.com/problems/search-in-rotated-sorted-array/description/一个递增的没有重复元素的数组,做一次移位操作,然后在数组中查找偶一个元素返回索引,如果没有返回-1。首先要明白递增数组移位以后的特征,必然是前半段总比后半段大,而且各自内部是有序的。很明显这是一个特殊的二分查找。仍然是取得中间元素a[m],之原创 2017-09-06 11:35:07 · 187 阅读 · 0 评论 -
【Leetcode】81. Search in Rotated Sorted Array II
https://leetcode.com/problems/search-in-rotated-sorted-array-ii/description/是上一题的变种,允许数组中有相同元素。大致思路不变,还是特殊的二分,但是有一些小的case需要处理。在没有重复元素的场景下,我们判断左半边是否有序是用条件“a[low]所以我们不能用小于等于来判断左半边是否有序,只能用小于来判断,如果a原创 2017-09-06 11:47:23 · 190 阅读 · 0 评论 -
【Leetcode】最小栈
在栈结构加一个返回最小值的方法。原理是每一次push一个差值x-min,可以记录上一次的最小值。如果x小于上一次的min,就更改min。同时在pop的时候,要看栈顶是否是最小值,如果是,那么pop了以后就需要更新最小值为x+min。public class MinStack { Stack stack; int min; /** initialize your data st原创 2017-09-06 13:40:03 · 1065 阅读 · 0 评论 -
【Leetcode】旋转数组最小值
https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/description/有一个递增的旋转数组,找出最小值。个人习惯写二分算法时,while的条件为low需要首先处理特殊情况,就是本身有序的情况,如果a[low] 当a[m]>a[high]时,说明m在左侧,这时铁定需要找[m+1,high],否原创 2017-09-06 13:17:51 · 2531 阅读 · 2 评论 -
【Leetcode】252,253 meeting room系列 区间问题
252,给出一堆闭区间,问这些区间是否互相都不相交思路是对区间按照第一位排序,然后遍历排序后的区间,维护一个第二位的最小值,看是否有一个区间额第一位大于该最小值,如果有那么这两个区间肯定不相交。public boolean isInterval(int[][] intervals){ List pairs = new ArrayList<>(); for(int i = 0; i原创 2017-10-07 00:47:12 · 2394 阅读 · 0 评论 -
【Leetcode】560. Subarray Sum Equals K
题目:https://leetcode.com/problems/subarray-sum-equals-k/description/意思是找出和等于k的子数组的个数。这个题目使用O(n^2)是肯定可以的。但是如果允许使用额外空间,可以降低时间复杂度。思路是:S(i)表示第0到第i位置的子数组之和,那么S(i,j)=位置i到位置j子数组的和=S(j)-S(i-1)。所以,遍历一原创 2017-10-22 08:39:39 · 250 阅读 · 0 评论 -
【Leetcode】最接近和子数组
这次是Lintcode的题目:http://www.lintcode.com/zh-cn/problem/subarray-sum-closest/给一个数组和k,找出一个子数组,和最接近k,如果有多个返回任意一个。当然n平方肯定可以解决,但是额外使用空间可以Onlogn。思路还是用S(i)-S(j)的方式。先计算出全部的s(i),然后存入map,key是sum,value是最后一原创 2017-10-22 09:05:59 · 1905 阅读 · 0 评论 -
【Leetcode】424. Longest Repeating Character Replacement
题目:https://leetcode.com/problems/longest-repeating-character-replacement/#/description题目给定一个string和一个k。最多可以把k个字符更改,且更改以后必须相同。返回最长的连续的相同字符数目。这个题目可以在On内解决,使用滑动窗口的思想。两个指针start和end,end向后移动,每一次都找出start原创 2017-03-22 10:36:21 · 787 阅读 · 0 评论 -
【Leetcode】417. Pacific Atlantic Water Flow
题目:https://leetcode.com/problems/pacific-atlantic-water-flow/?tab=Description这是一道很好的练习bfs和dfs的题目。题目给出了一个矩阵,矩阵数字代表山地的高度,水流只能从高处流到地处或者至少相等。找出所有的坐标,从这个坐标可以到达左边界或者上边界中的一个并且也可以到达右边界或者下边界中的一个。刚开始做这个题目原创 2017-03-12 07:54:54 · 980 阅读 · 0 评论 -
【Leetcode】410. Split Array Largest Sum
题目:https://leetcode.com/problems/split-array-largest-sum/?tab=Description题目要求是把一个数组分成m个连续的部分,让m个部分的最大值最小。每一种分法都会存在一个最大值,目的是找出所有分法的最大值中的最小值。有两个思路。1.第一个是dp,或者说backtracking带memo。定义函数find(i, m),返回原创 2017-02-28 11:06:23 · 405 阅读 · 0 评论 -
【Leetcode】268. Missing Number
给定一个数组,大小为n,里面只含有0-n的数字,且不同,那么肯定有一个数字无法包含。找出这个数字。https://leetcode.com/problems/missing-number/?tab=Description先介绍一个运用bit操作的算法。首先下标肯定是0到n-1,值是0到n少一个,那么把下标和值一起做xor,最后再和n做xor,缺失的值只出现了一次,其余都是两次。结果就是原创 2017-03-01 03:57:49 · 261 阅读 · 0 评论 -
【Leetcode】115. Distinct Subsequences
又是一道DP的题目,个人感觉DP的题目比较难,主要因为:(1)DP的难点是寻找子问题,如果找到很好的子问题,那么就可以瞬间搞定。(2)通常也会带有一点backtracking的思想,有时候总是优先想到bt,然后思路就被限制了。DP在leetcode主要解决两类问题,第一是求数目,第二是求最优解。少数可以解决所有解问题,不过一般而言所有解还是得用带memo的递归或者子问题。在数组中出现的dp原创 2017-03-01 10:53:21 · 363 阅读 · 0 评论 -
【Leetcode】72. Edit Distance
题目:https://leetcode.com/problems/edit-distance/?tab=Description题目要求最少的变换数目把s1变成s2,有三种操作,insert,change,delete。f(i,j)返回从s1从i位置以后的string变换到s2从j位置以后的string,最开始从两个sting的开头比较,如果一样,返回f(i+1,j+1)。否则有三种方式,如原创 2017-03-02 11:55:49 · 262 阅读 · 0 评论 -
【Leetcode】300. Longest Increasing Subsequence
1.最长递增子序列:思路是dp,先说一个很general的idea。子问题为dp[i],以array[i]为结尾的最长子序列的最后一个元素。那么只要遍历之前的所有dp即可,取可行的里面的最大值。复杂度On2. public int maxISLength(int[] array){ int[] dp = new int[array.length]; dp[0] = 1; int原创 2017-03-03 03:09:09 · 298 阅读 · 0 评论 -
【Leetcode】373. Find K Pairs with Smallest Sums
题目:https://leetcode.com/problems/find-k-pairs-with-smallest-sums/#/description意思是,给定两个有序数组,返回第k小的pair。大小由和决定。对于非单一数组而言,找顺序统计量的好办法是使用最小堆。所以一个很直接的思路就是把所有的点对加入到最小堆,然后输出前k个。问题就是没有利用到题目中“两个数组都有序这个条件”原创 2017-03-18 04:35:53 · 666 阅读 · 0 评论 -
【Leetcode】Single Number 系列问题
这三道题目很考察bit操作思路。使用了下列几个技巧。1.如何取得一个int数字二进制表示的每一位,方法就是使用逻辑右移操作,逐位与1做&操作;2.亦或xor是一个很关键的操作,0与任意一个数做偶数次xor结果是0,奇数次结果是1。3.位操作是满足交换律的,因为每一个bit是满足的。4.如何得到一个int的最右侧的第一个1?方法是与其相反数做&。因为相反数是取反加一,取反以后,第一个原创 2017-02-26 04:28:26 · 918 阅读 · 0 评论 -
【数据结构与算法】二维数组 最大矩形和
使用Kadane算法可以很方便地求解一维数组的最大连续子序列之和。下面是Kadane算法的延伸,在二维数组中求解最大矩形。思路是要利用一维数组的求解方法来求解二维,假设现在要求以i列开始到j列结束的最大和,不能是i和j之间的,必须以i和j是开始和结束。可以把i和j之间的列相加,最终得到一个一维数组,那么这个一维数组的最大值就是i和j的最大值,这是因为这个一维数组中存的就是每一行的和,与co原创 2017-03-05 02:26:06 · 2288 阅读 · 0 评论 -
【Leetcode】363. Max Sum of Rectangle No Larger Than K
https://leetcode.com/problems/max-sum-of-sub-matrix-no-larger-than-k/?tab=Description这个题目之所以hard是有两个点:一个是二维数组求最大另一个是求不大于k的最大这两点在前面的博客中都有讲。原创 2017-03-05 05:57:42 · 704 阅读 · 0 评论 -
【Leetcode】最小 subsetsum
给定一个数组和一个target,找出最少的元素和为target。其实是一个subsetsum问题,之前额subsetsum存储的是boolean,这里存长度即可。定义子问题dp[i][j]为使用前j个元素达到和j的最小长度,那么dp[i][j]首先可以使用dp[i][j - 1]的结果。然后再看能否使用array[j],那么就要看dp[i-array[j]][j-1]的值了。代码:原创 2017-03-09 09:55:14 · 473 阅读 · 0 评论 -
【Leetcode】241. Different Ways to Add Parentheses
题目:点击打开链接https://leetcode.com/problems/different-ways-to-add-parentheses/?tab=Description给出一个表达式,求出所有可能的表达式的结果。(1)对于加括号这个问题,是按照操作符分割来加的。所以每一次都是若干个分治过程,个数等于操作符数目。return case是没有操作符。这个有重叠子问题的特征,因此如果想原创 2017-03-09 11:46:24 · 288 阅读 · 0 评论 -
【数据结构与算法】最长公共子串 最长公共子序列
1.最长公共子串:找出s和t的公共子字符串的最大长度。使用dp,定义子问题dp[i][j]:s[0-i]和t[0-j]的最长公共子串长度。那么dp[i][j] = dp[i - 1][j - 1] + 1 if s[i]=t[j], otherwise 0.代码:public int longestCommonSubString(String s, String t){ int[]原创 2017-03-07 05:19:26 · 828 阅读 · 1 评论 -
【Leetcode】282. Expression Add Operators
题目:https://leetcode.com/problems/expression-add-operators/?tab=Description意思是给一个只包含数字的string,找出所有的可能的添加运算符+ - *的方式使得计算计算结果是target。看了别人代码写的,里面有很多地方值得借鉴。public List addOperators(String num, int ta原创 2017-03-10 04:07:54 · 416 阅读 · 0 评论 -
【Leetcode】437. Path Sum III
题目:https://leetcode.com/problems/path-sum-iii/?tab=Description题目要求找出和为sum的路径的数目。路径的开头和结尾可以是任意的。之前有一道题目,要求路径的开头和结尾必须是root和leaf,那么做一个遍历,当到达叶子节点时,检测是否和为sum。这里不能到达null再检测,因为叶子节点的null有两个,结果就返回2,多出一个,所以原创 2017-03-11 01:57:22 · 415 阅读 · 0 评论 -
【Leetcode】491. Increasing Subsequences
题目:https://leetcode.com/problems/increasing-subsequences/?tab=Description找出所有的长度大于等于2的递增序列。思路:这里是找出所有的解。因此选择backtracking。要注意一点,关于去重。之前做过类似的,combinationsum那种,那个类型的题目是从集合中选元素,因此集合的顺序无关紧要,但是这里是序列,顺序是原创 2017-03-11 05:43:22 · 464 阅读 · 0 评论 -
【Leetcode】190. 7. reverse bits, integer
190,reverse bits:https://leetcode.com/problems/reverse-bits/?tab=Description把一个int的二进制反转。要得到一个int的二进制的每一位,需要使用移位操作,但是取得的每一位如何赋值给结果?一个思路就是先移位再或操作,更好的的是每次对结果的最低位赋值,然后把结果左移一位,那么结果和输入每一次只移动一位。最后一次结果不能原创 2017-02-27 23:30:36 · 241 阅读 · 0 评论