![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
Jerry王
一介码农,热衷于技术,爱好广泛
展开
-
[LeetCode] Binary Tree Inorder Traversal [41]
题目原题链接解题思路代码实现原创 2014-07-31 20:34:31 · 815 阅读 · 0 评论 -
[LeetCode] Restore IP Address [28]
给一个字符串,将其转换成IP地址。这个题可以理解成,将字符串切割成若干个小块,将其中合法的(数值在0-255)组合起来,拼接成一个合法的IP地址。说到这也就看出来了这还是一个组合问题,对于组合问题,算法都是结构性的递归套循环,看如下循环:原创 2014-06-11 09:45:03 · 1249 阅读 · 0 评论 -
[LeetCode] Distinct Subsequences [29]
解题思路题目:Given a string S and a string T, count the number of distinct subsequences of T in S。解题思路:给两个字符串S和T, 求在字符串S中删除某些字符后得到T,问一共能有多少种删除方法?这个题用常规方法超时。得用动态规划,动态规划最主要的就是要找到动态规划方程。首先记:dp[i][j] 为 从S[0..j-1]中删除某些字符后得 T[0...i-1]的不同删除方法数量。动态规划方程为: dp[i][j]原创 2014-06-11 12:12:44 · 1133 阅读 · 0 评论 -
[LeetCode] Rotate Image [26]
题目:...解题思路:顺时针方向旋转数组90°。这个题也是个没啥意思的题,自己画画图,找找规律。就出来了。我举一个n=4的例子还说明下规律:通过图可以看出A[0][0] = A[3][0],....。从这些中我们可以找到如下规律: A[i][j] = A[n-1-j][i]; A[n-1-j][i] = A[n-1-i][n-1-j]; A[n-1-i][n-1-j] = A[j][n-1-i]; A[j][n-1-i] = A[i][j];(原来的A[i][j原创 2014-06-10 10:42:58 · 1203 阅读 · 0 评论 -
[LeetCode] Climbing Stairs [24]
解题思路:爬楼梯:一次可以爬1阶或者2阶,问爬n阶楼梯有多少方法?这是个典型的斐波拉切应用场景,我们下面来分析下:对于1阶,只有 1 种方法, 记为f(1);对于2阶,记为f(2): 最后一步只爬1阶,有 f(1); 最后一步一次爬2阶,即一步上来,这是1中方法; 综合下来 f(2) = f(1) +1 = 2;对于3阶,记为f(3): 最有一步只爬1阶,有f(2)种方法 最后一步一次爬2阶,有f(1)种方法; 综合下来 f(3) = f原创 2014-06-09 11:10:39 · 1190 阅读 · 0 评论 -
[LeetCode] Remove Duplicates from Sorted Array II [27]
移除数组中重复次数超过2次以上出现的数,但是可以允许重复2次。这个题类似Remove Duplicates from Sorted Array,第一个想法很直接就是计数,超过2次的就忽略,依据这个思路的代码见代码一;上面的思路可行,但是代码看着比较冗余,判断比较多。再来想想原来的数组,该数组是排好序的,如果一个数出现3次以上,那么必有A[i] == A[i-2]。所以根据这个关系可以写出比较精简的代码二。详见代码。原创 2014-06-10 11:53:33 · 1083 阅读 · 0 评论 -
[LeetCode] Search a 2D Matrix [25]
题目...二维数组中的查找,这是个简单的题,根据题意可以推出,这个二维数组其实是一个有序的一维数组。解决思路也很容易想到,每次比较每一维最后一个元素,如果该元素比要找的元素小,说明这个行不可能含该元素;如果相等,那就找到了,如果最后一个元素比要找元素大,说明该元素如果出现比在这一行。然后再在这一行中就行查找(可以用顺序,也可二分)。代码如下:原创 2014-06-09 11:36:19 · 992 阅读 · 0 评论 -
[LeetCode] Search Insert Position [21]
解题思路给一个排序数组和一个数,寻找该数在数组的位置或者插入位置。本题考查的还是二分查找。二分查找返回的结果就是该数在数组中该插入的位置。代码实现原创 2014-06-08 16:14:45 · 1009 阅读 · 0 评论 -
[LeetCode] Longest Substring Without Repeating Characters [15]
题目:Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length原创 2014-06-07 12:43:48 · 982 阅读 · 0 评论 -
[LeetCode] Remove Duplicates from Sorted Array [19]
题目...For example,Given input array A = [1,1,2],Your function should return length = 2, and A is now [1,2].解题思路,移除数组中的重复元素,并返回新数组的长度。这个题目应该算是简单的题目。使用两个变量就可以。具体的看代码代码实现...原创 2014-06-07 17:46:56 · 993 阅读 · 0 评论 -
[LeetCode] Interleaving String [30]
题目:交差字符串。给3个字符串s1, s2, s3,判断s3是不是由s1和s2组成的交叉字符串。设s1长度为m, s2长度为n,判断 s3[0...m+n-1] 是不是由s1[0...m-1], s2[0...n-1]组成的交叉字符串,假设s1[m-1] == s3[m+n-1],则只需判断s3[0...m+n-2]是不是由s1[0...m-2], s2[0...n-1]组成的交叉字符串...,依次这样判断下去。从这可以总结,这个问题可以划分为比它小的问题,这里使用动态规划应该比较合适。dp[i][j]原创 2014-06-11 14:59:54 · 1227 阅读 · 0 评论 -
[LeetCode] Subsets II [32]
题目Given a collection of integers that might contain duplicates, S, return all possible subsets.原题链接(点我)解题思路这个题很subsets这个题一样,不过这里允许给出的集合中含有重复元素,对于这个条件之需要加一个判断条件就可以了,其余代码和Subsets都一样。代码实现....原创 2014-06-12 10:16:02 · 1128 阅读 · 0 评论 -
[LeetCode] Decode Ways [33]
题目A message containing letters from A-Z is being encoded to numbers using the following mapping:原题链接(点我)解题思路及代码;解码方法数量问题。英文26个字母对应1到26,给一串数字,问翻译为字母有多少种方法?这个题第一思路是想到使用组合排列的方法,穷举所有的可能。很好,写出如下代码...但是提交后出来的结果是超时。再想想,使用动态规划的方法来做。对于串s[0...i]的解码数量应该和s[0..原创 2014-06-12 11:55:23 · 1286 阅读 · 0 评论 -
[LeetCode] Flatten Binary Tree to Linked List [39]
题目原题链接(点我)解题思路daima原创 2014-07-31 20:16:11 · 752 阅读 · 0 评论 -
[LeetCode] Binary Tree Postorder Traversal [42]
题目Binary Tree Postorder Traversal Total Accepted: 23797 Total Submissions: 76975My SubmissionsGiven a binary tree, return the postorder traversal of its nodes' values.For examp原创 2014-07-31 20:46:22 · 753 阅读 · 0 评论 -
[LeetCode] Binary Tree Preorder Traversal [40]
题目原题地址原创 2014-07-31 20:21:50 · 790 阅读 · 0 评论 -
[LeetCode] Combinations [38]
题目Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.For example,If n = 4 and k = 2, a solution is:[ [2,4], [3,4], [2,3], [1,2], [1,3],原创 2014-06-14 17:46:45 · 1049 阅读 · 0 评论 -
[LeetCode] Word Search [37]
给一个二维字符数组,给一个字符串,问该二维数组是否包含该字符串。比如一个二维数组[ ABCE SFCS ADEE ]和字符串"ABCCED",这个就包含。解决这个问题,主要的关键是怎么解决在二维数组中查找方向,如何来标识哪些是走过的。代码如下原创 2014-06-14 17:24:07 · 1114 阅读 · 0 评论 -
[LeetCode] Search in Rotated Sorted Array II [36]
题目Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed?Would this affect the run-time complexity? How and why?Write a function to determine if a given target is in the array.原题链接(点我)解题思路这题和Search in Rotated Sorted Array问题类似,原创 2014-06-13 15:16:39 · 964 阅读 · 0 评论 -
[LeetCode] Search in Rotated Sorted Array [35]
旋转数组中的查找。[1, 2, 3, 4, 5, 6]的一个旋转数组为[4, 5, 6, 1, 2, 3]。在旋转数组中寻找一个数。最直接的方法,一次遍历,时间复杂度O(n)。但是既然是一个部分有序的数组,那么对于有序的部分我们可以想方法用二分查找。这个效率可以提高。代码:....原创 2014-06-13 11:57:59 · 1112 阅读 · 0 评论 -
[LeetCode] Search for a Range [34]
题目Given a sorted array of integers, find the starting and ending position of a given target value.解题思路:查找一个数出现的范围,给一个排好序的数组和一个数,找出这个数在数组中出现的范围。这个题直接使用一次遍历就可以得到结果,这样的时间复杂度为O(n)。但是对于有序数组我们一般可以使用二分查找可以得到更好的O(logn)的时间复杂度。我们可以使用二分查找找到这个数第一次出现的位置和这个数最后一次出现的位原创 2014-06-13 11:14:01 · 1147 阅读 · 0 评论 -
[LeetCode] Subsets [31]
题目Given a set of distinct integers, S, return all possible subsets.原题链接(点我)解题思路子集合问题。给一个集合 ,求出其所有的子集合。这个题也是个组合问题--老思路:递归加循环。代码实现...原创 2014-06-12 09:59:19 · 1032 阅读 · 0 评论 -
[LeetCode] Median of Two Sorted Arrays [16]
求两个排序数组的中位数。这个题可以有以下几个思路:首先可以想到的是将两个数组merge起来,然后返回其中位数。第二个是,类似merge的思想加上计数,找到(m+n)/2个数或者其前后的数,这个就可以算出中位数。这个方法对于各种情况需要一一考虑到。第三个,假设A[k/2-1]<B[k/2-1],那么A[k/2-1]之前的数一定在整个有序数列中(m+n)/2之前。这里我给出后面两种思路的代码。代码一( 思路三)原创 2014-06-07 15:44:55 · 804 阅读 · 0 评论 -
[LeetCode] Longest Palindromic Substring [14]
最长回文字串,相信做过Palindrome Partitioning II 这个题的同学应该可以很快做出来。没错,这个题还可以使用动态规划方法得到一个时间复杂度为O(n^2)的解法,当然如果你想要更好的时间复杂度的算法也是有的。好的,我们先来看看时间复杂度为O(n^2)的算法。代码实现--动态规划O(n^2)相信如果你在网上看过了别人的算法,你会发现我的算法是最简洁的。哈哈,这个题需要注意的是如果你用惯了vector的话,你这里肯定会得到超时的提示......代码二--复杂度为O(n)的算法原创 2014-06-06 23:15:12 · 1047 阅读 · 0 评论 -
[LeetCode] Merge Sorted Array [22]
题目:Given two sorted integer arrays A and B, merge B into A as one sorted array.原题链接(点我)解题思路:合并两个数组为一个有序数组,这题也很简单,唯一考查的地方就是怎么处理数组,是从前往后还是从后往前。一般情况,从后往前的效率比从前往后高,也要省不少事。代码如下,从后开始合并。代码实现:原创 2014-06-08 16:56:45 · 1094 阅读 · 0 评论 -
[ LeetCode] Single Number [3]
数组含有n个数,其中有一个数只出现1次,其余的数都出现两次,求只出现一次的数。 这个主要考察的是位运算中的异或运算的性质-----当两个相等的数做异或运算他们的值为0(a^a = 0)。本题中对数组中所有的数做异或,那么最后异或的结果就是只出现1次的数。思想很简单代码如下:原创 2014-06-04 08:52:22 · 1080 阅读 · 0 评论 -
[LeetCode] String to Integer (atoi) [7]
这是个老题目了,主要考察的是能不能考虑到所有的情况,还有就是怎么判断是否溢出。情况大致分为如下四种:(下面我使用@代替空格,x代表除数字之外的所有字符)1. "@@[+-]3232343@@"2. "@@[+-]333x54"3. "@@[+-]4343"4. "2147483648"或者"-2147483649"(也就是溢出的情况)下面代码中给出了两个判断是否溢出的方法。原创 2014-06-05 20:49:01 · 1123 阅读 · 0 评论 -
[leetcode] Reverse Words in a String [1]
翻转字符串中的单词顺序,这是个老题目了,但是leetcode上面的要求更为严格,如: 要求把开头和结尾的空格删除掉; 缩减单词间的空格数为1(如果有多个空格); 单词若全是空格,则返回一个空字符串(""). 此题思想不难,主要是注意上面三个要求和一些细节就可以AC。 大致分为两步:一个是常规的翻转字符串中的单词;另一个就是想方法去掉串中的多余的单词;这两步骤的顺序可以颠倒。原创 2014-06-03 10:53:33 · 1292 阅读 · 0 评论 -
[LeetCode] Evaluate Reverse Polish Notation [2]
计算逆波兰表达式,了解更多关于逆波兰表达式请点击。 计算逆波兰表达式这是个很典型的栈应用的例子。 解题方法就是用栈来处理,需要注意的是本题输入给的是字符串数组,所以需要在字符串和整数之间有个转换。原创 2014-06-03 11:54:48 · 1166 阅读 · 0 评论 -
[ LeetCode ] Longest Common Prefix [5]
题目Write a function to find the longest common prefix string amongst an array of strings.原题链接解题思想给一个字符串数组,求这些字符串的最长公共前缀。这个题应该是比较简单的,直接写代码,一次AC。解题思想是依次对数组中的字符串求最长公共前缀。代码实现class Sol原创 2014-06-04 10:59:01 · 958 阅读 · 0 评论 -
[LeetCode] Regular Expression Matching [6]
设计一个支持‘.' 和 '*' 的正则表达式匹配算法。这个题复杂的地方在于对于 '*' 的处理,这个符号在正则表达式中被称为贪婪型的量词。这个量词在实际匹配过程中也是尽可能多的匹配直到词尾或者不匹配成功才结束,然后如果其后面还有没有匹配的,则回退到合适的位置,然后才进行下一个匹配。正则表达式中的匹配优先与回溯大概也就是这个意思。关于正则表达式这方面的知识,有兴趣可以读读《精通正则表达式》的第4章表达式的匹配原理。回到本题,正因为 '*'的特殊性,我们在分类的时候选择根据 '*' 来进行,分类后其子问题也原创 2014-06-04 12:09:54 · 1008 阅读 · 0 评论 -
字符串匹配之KMP---全力解析
网上写KMP的文章是不少,但是真正清晰简洁就没有了(july的文章太繁琐),所以自己就研究了一晚上,弄清楚了kmp的计算过程,也就在此分享下。KMP算法最难理解的是就是next数组的计算过程,在此分享下我所理解的kmp算法以及next数组的计算过程:原创 2014-04-18 08:34:41 · 2252 阅读 · 12 评论 -
Longest Palindromic Substring-----最长回文子串
今天要写的问题了就是这一个字符串中找出最长的回文字串,比如串:"abcdedabakml", 他的最长回文字串就是"abcdedaba"。一般的方法有暴力法,动态规划法,今天来写一个时间复杂度为O(n)的算法。回文匹配,一般情况会分奇数和偶数来分开进行设计算法来统计,今天介绍的算法重新构造了一个字符串,这个新字符串消除了之前的奇偶差别,使得只用设计一种算法就可以。原创 2014-04-23 22:46:51 · 1385 阅读 · 0 评论 -
字符串匹配之KMP算法(续)---还原next数组
通过前面的第一篇文章,知道了怎么求next数组,相信很多喜欢刨根问底的人就会问,我按照你的做法确实能够解决这个问题,那么next数组到底是个神马东西喃?为啥会那样求喃?本篇文章全面还原next数组是什么,它的作用,以及它和boyer-Moore算法关系。原创 2014-04-20 08:45:52 · 2288 阅读 · 5 评论 -
[ LeetCode ] Single Number II [4]
数组中含有n个数,其中一个数只出现1次,其余个数均出现3次,就只出现1次的数。首先应该想到的就是计数法,先对数组排序,然后统计每个数出现的次数,找出出现次数为1个数;更高级一点的方法还是用位运算,充分发掘数字二进制中的0和1出现的规律。一个数字是由0和1组成的,如果这个数字出现3次,那么这个数字中各个位上0和1出现的次数也应该是3次。按照这样统计数组中所有数的各个位1的个数,如果个数是1个倍数,这所求数字该位不为1。举例如下:数组: 1, 3, 1, 5, 1, 6, 5, 6, 6, 5对应的原创 2014-06-04 10:31:52 · 970 阅读 · 0 评论 -
[LeetCode] Reverse Integer [8]
题目Reverse digits of an integer.Example1: x = 123, return 321Example2: x = -123, return -321。解题思路:颠倒一个整数中数字的位置,哈哈,类似翻转字符串一样,只不过整数需要计算,需要考虑溢出,其他无而。写出代码不难,只是溢出的时候怎么办,我这里是按照返回-1处理的,在leetcode上可以AC。代码实现:原创 2014-06-05 23:06:38 · 1000 阅读 · 0 评论 -
[LeetCode] ZigZag Conversion [9]
题目:convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".解题思路:这个是个纯粹找规律的题,其他没啥特殊的。下面的例子nRows=4;找规律按照数组小标开始,寻找下标出现的规律,1. 第一行和最后一行相邻元素下标之差为 2*nRows-2;2. 除过第一行和最后一行,其余行要多一个元素,该元素出现的下标和行号有关,比如5 = 1 + 6 - 2,可以总结出规律为 j + 2*nRows-2 - 2*i;关于 i 和 j 看以看下面原创 2014-06-06 11:58:27 · 1140 阅读 · 0 评论 -
[LeetCode] Sort Colors [23]
一个数组,数组元素含有3种颜色,红,白,蓝。要求将数组排序,将相同颜色排在一起,整体按照红白蓝的顺序。这个题在日常生活中很常见。比如要将东西归类,当然这个题简化成了相同颜色就认为完全相同。基于这个特点,可以先统计各个颜色出现的次数,然后在按照题目要求的红白蓝的顺序,依次放n个红,m个白,k个蓝,就Okay了,代码详见代码一。这个思路也就是题目下面提示的方法,这个方法需遍历2次数组,本题要求遍历一次就搞定的方法,想想这个还是有点难度的。这个题目其实我们很容易就能联想到快排的划分上来,但是仔细一想,如果按原创 2014-06-08 22:19:22 · 1016 阅读 · 0 评论 -
[LeetCode] Implement strStr() [18]
字符串匹配这也是个老题了,方法主要有下面4种,1. 暴利破解法(BF),这个没啥说的,就是一轮一轮的比较,知道遇到相匹配的,这个的时间复杂度为O(n^2)。2. KMP,这应该是字符串匹配领域中最长听说的算法了吧。3. Horspool算法,这个不常听说,但是也是很有名的。4. Boyer-Moore,这个听说过的人应该也不会很多,这个算法在大量字符串的情况下,效率是最高的,能达到kmp的3到4倍。上面四种算法都很重要,一般标准库中的字符串匹配都使用的是暴力法。上面四种算法详细的见我下面的这几篇原创 2014-06-07 16:58:01 · 1054 阅读 · 0 评论 -
[LeetCode] Remove Element [20]
题目Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn't matter what you leave beyond the new length.原题链接(点我)解题思路给一个数组和一个数字,移除该数字在数组中所有出现的地方。这是一个非常简单的题目,应原创 2014-06-07 18:08:24 · 987 阅读 · 0 评论