
LeetCode
「已注销」
菊花厂攻城狮,十余年开发经验,擅长Java/Ruby/Golang等多种编程语言
展开
-
LeetCode题解-2-Add Two Numbers
解题思路这个题目也是比较简单的。主要需要考虑的是如何处理l1和l2长度不一致的情况,进位的处理,还有特别考虑最后一次进位的情况。为了简化处理,我采用了一个哑结点作为head,用carry下次操作的进位值,默认是0. 然后从头开始遍历,每次的和等于上一次进位加上2个结点的值(如果存在的话),如果其中一个结点为空,就当值为0处理,直到2个结点都为空。最后2个结点为空时判断进位是否为1,如果是就增加多一原创 2017-02-17 21:42:42 · 273 阅读 · 0 评论 -
LeetCode题解-16-3Sum Closest
解题思路题目要求找到数组中a+b+c最接近target的和。思路和15题是类似的,也是排序采用二层遍历,计算出目标值c,用二分查找,如果找到就可以直接返回,如果没有找到,那就是找到插入的位置,计算该位置左右两边数字(假如存在)得到的和,看看是否存在更接近的和。对于Java来说,Arrays.binarySearch对于没有匹配的情况,就可以支持返回应该插入的位置(用一个特定的负数表示)。参考源码pu原创 2017-03-15 20:35:34 · 396 阅读 · 0 评论 -
LeetCode题解-15-3Sum
解题思路题目要求找到数组中所有a+b+c=0的数字。朴素算法是三层遍历,复杂度是O(n^3)。 我的思路是首先对数组排序,需要O(nlogn),然后对a,b进行二层遍历并对c进行二分查找,需要O(logn*n^2)。 最终复杂度是O(logn*n^2),应该还有优化空间。参考源码public class Solution { public List<List<Integer>> thre原创 2017-03-15 20:35:01 · 314 阅读 · 0 评论 -
LeetCode题解-13-Roman to Integer
解题思路题意是说罗马数字转成普通数字。这个题目和12题是类似的,首先要理解罗马数字的表示法,它是按大小结合顺序来的,前面几个字母组合起来如果能够解释成较大的数字,那就使用这个表示,而不是按举个字母来的。所以罗马数字转成数字,例如当前位置i的字符是c(i),对应的值是100,如果后面位置i+1的字符c(i+1),对应的值是1000,那么就应该理解成CM,对应的值是1000进去100,得到900。结论就原创 2017-03-04 22:00:17 · 280 阅读 · 0 评论 -
LeetCode题解-12-Integer to Roman
解题思路题意是说把1~3999之间的数字转成罗马数字。首先要理解罗马数字的表示法,它是按大小结合顺序来的,前面几个字母组合起来如果能够解释成较大的数字,那就使用这个表示,而不是按举个字母来的。所以数字转成罗马数字,就可以从字母可以表示的最大数字开始,每找到一个就是增加对应的罗马数字,并记录对剩余部分数字匹配,直到这个罗马数字过大,再取一个较小的继续尝试。参考源码public class Soluti原创 2017-03-04 21:59:39 · 252 阅读 · 0 评论 -
LeetCode题解-11-Container With Most Water
解题思路题意是说,有一堆有序的数字ai,要计算min(ai,aj)*abs(i-j)的最大值,普通的算法就是列举所有的情况,时间复杂度是O(n^2)。下面介绍一下O(n)的思路。首先记录左边是left,右边是right,那么初始化max就是左右两边组成的值。 假设左边比较小。如果left+i比left的值要小,那么由left+i和right组成的值会更小,而left和left+1组成的值也是更小原创 2017-03-04 21:58:55 · 403 阅读 · 0 评论 -
LeetCode题解-7-Reverse Integer
解题思路这个题目是反转一个整数,但是要求如果出现溢出的时候返回0。思路如下:如果是负数,考虑先转成正数再处理,所以对MIN_VALUE先要做特殊处理。 现在都是正数了,反转结果用一个long来存储,这样就保证不会溢出了。 如果处理后结果大于MAX_VALUE,说明溢出了,返回0。 结果在转成int返回。 参考源码class Solution { public int rev原创 2017-02-26 11:40:41 · 295 阅读 · 0 评论 -
LeetCode题解-6-ZigZag Conversion
解题思路这个题目我是分2种情况来考虑的,考虑首行和最后一行,每个数的间隔是2*(numRows-1), 对于中间其他行,那么的间隔是2*(numRows-1)-2*row或者2*row, 其中row表示当前所在的行号。算法是逐行扫描,计算当前符号在输入字符串中的位置,而对应转换后的位置不断加1就可以了。可以看下面的图:首行和尾行其他行参考源码public class Solution {原创 2017-02-23 20:58:14 · 223 阅读 · 0 评论 -
LeetCode题解-5-Longest Palindromic Substring
解题思路题目是查找最长的回文子串。如果某个字符串是一个回文串,那么形式可能是cbabc,或cbaabc的形式,要找到最长的回文子串,可以以某个字符a开始,区分长度是奇数还是偶数,向左右两边一直比较,直到找到不同的字符。找到的字符就是以a为中心的最长回文子串。这样,只要遍历字符串,找到每个字符为中心的最长回文子串,就可以得到最终结果了。参考源码public class Solution { p原创 2017-02-23 20:10:26 · 263 阅读 · 0 评论 -
LeetCode题解-4-Median of Two Sorted Arrays
解题思路这个题目是说在两个已排序的数组中找到中间的数,并且要求复杂度是O(ln(m+n))。看到这个复杂度要求,就不能使用简单的数组合并后取中间位置,而是要考虑类似二分法之类的算法。算法的要点就是把题目转换成寻找第k个位置的数字,对于数组A和B,假设都长度都大于k/2,那么都取k/2的位置进行比较,假设A[k/2]小于B[k/2],那么A中k/2之前的位置都不可能是第k个位置,那么可以直接排除,问题原创 2017-02-23 20:09:48 · 298 阅读 · 0 评论 -
LeetCode题解-10-Regular Expression Matching
解题思路思路是动态规划。假设s是待匹配字符串,p是表达式。定义数组matchs,其中matchs[i,j]表示s[0,i)和p[0,j)是否匹配,那么结果就是求matchs[s长度加1,p长度加1]。对于matchs[i,j]分以下情况: * i=0,j=0,空的肯定能匹配 * i=0,j!=0,那么在j>1的情况下且p[j-1]是星号的时候,match[0,j]=match[0,j-2],相当原创 2017-03-02 21:37:24 · 301 阅读 · 0 评论 -
LeetCode题解-9-Palindrome Number
解题思路判断数字是否是回文数。非常简单,用rev做累计,每次取原值的最后一位累计上去,最后判断rev是否和原值相同即可。参考源码public class Solution { public boolean isPalindrome(int x) { if (x < 0) { return false; } int tmp原创 2017-03-02 21:34:44 · 251 阅读 · 0 评论 -
LeetCode题解-8-String to Integer (atoi)
解题思路这个题目是要把一个字符串转成整数。按照以下思路:判断是否正数还是负数用一个value记录当前计算到的数值,每次找到一位就做乘10再加上新的数字需要特别处理超过最大最小值的情况参考源码public class Solution { public int myAtoi(String str) { if (str == null || str.length() ==原创 2017-03-02 21:33:59 · 225 阅读 · 0 评论 -
LeetCode题解-3-Longest Substring Without Repeating Characters
解题思路首先要读懂题目,它要求的是找到最长的子串,并且子串中没有出现重复的字符。我的想法,是用一个map存储每个字符最后出现的位置,还要有个变量start,它用来记录上一次出现重复的位置,如果当前字符上一次出现的位置比start小,那么说明中间出现了重复,不能当成有效的子串。记得就是在扫描结束后,再判断一下最后一段子串。给个图简单说明一下。 参考源码public class Solution {原创 2017-02-18 16:33:35 · 269 阅读 · 0 评论 -
LeetCode OJ题解系列
其实LeetCode OJ之前已经做过了,近日上去看了一下,发现题目增加了很多。我打算重新刷一遍,并把题目思路和结果放到博客上来,当做一次刷题记录吧。计划会包括以下内容:题目id,题目名称,题目中文意义解题思路参考源码敬请期待。原创 2017-02-17 21:34:57 · 274 阅读 · 0 评论 -
LeetCode题解-1-Two Sum
解题思路这主要是给第一次接触LeetCode的童鞋准备的。题目说给定一个整型数组和一个数字,希望找到2个位置,这2个位置的和等于给出的数字。解题思路很简单,用一个两层遍历穷举就可以了,如有疑问请参考源码。参考源码public class Solution { public int[] twoSum(int[] nums, int target) { int len = num原创 2017-02-17 21:35:54 · 222 阅读 · 0 评论 -
LeetCode题解-14-Longest Common Prefix
解题思路题目是要寻找所有字符串中最长的公共开头部分。我的做法是对于某个位置的字符,看看其他字符串同样的位置是否也是这个字符,如果是则继续往后找,如果不是则表示最长的公共开头部分。为了避免越界,首先找到字符串的最小长度,用这个位置做边界,后面就不需要判断了。参考源码public class Solution { public String longestCommonPrefix(String[原创 2017-03-15 20:34:29 · 322 阅读 · 0 评论