LeetCode 1-10
1、两数之和 https://leetcode-cn.com/problems/two-sum/
如果本题使用暴力的做法,就直接双重for循环,此时时间复杂度是O(n^2),这里我们需要利用哈希表去记录元素。
如果使用哈希表的话,时间复杂度是O(n),空间复杂度也是O(n),此时相当于 用空间换时间
1 | class Solution{ |
2、两数相加 https://leetcode-cn.com/problems/add-two-numbers/
本题就是一个模拟加法的过程,在关于链表的解题中,我们可以采取构造出虚拟头节点的方法,避免头节点的判断。
1 | class Solution { |
3、无重复字符的最长字串
本题是一个标准的滑动窗口题,我们利用滑动窗口,可以很容易的求得连续的不含有重复字符的最长字串
1 | class Solution { |
4、寻找两个正序数组的中位数
本题我们利用递归的思想,寻找数组中的第k个数。 在递归的过程中,可以直接舍弃某一段数组一般的长度,最后的时间复杂度为O(log(m+n))
1 | class Solution { |
5、最长回文字串 https://leetcode-cn.com/problems/longest-palindromic-substring/
因为是判断回文子串, 我们可以使用最常规的方法,本题java可以利用O(n^3)的复杂度通过。先把暴力解法写一下
1 | class Solution { |
接下来我们考虑这样一种方式。
如果字符串长度为奇数,我们从中点开始左右扩张 枚举i的长度,左右边界为i-1,i+1 .
如果字符串长度为偶数,左右边界为i,i+1
1 | class Solution{ |
6、Z字形变换
本题是一个找规律的题目。 当我们从最上面一行,遍历到最下面一行时,索引顺序是增加的,当我们从最下面一行遍历到最上面一行的时候,索引顺序再减少。即是一个往返的过程,我们需要引入一个变量控制这个顺序。
1 | class Solution{ |
7、整数反转
本题可以使用转换为字符串再考虑的方法
接下来主要讲数学方法:
假设x=1234, 为了得到个位数字,我们每次将 x%10 ,然后x/10,这样就得到了4 ,3,2,1
然后我们将4,3,2,1变成4321 这也是一个固定的套路,即 从最高位开始累加,
n=n*10+x
1 | class Solution { |
8、字符串转换整数(atoi)
其实本题就是一个模拟题,为了省去多余的步骤,我们可以先用long,最后转换为int
1 | class Solution{ |
9、回文数
本题最直接的做法就是转换为字符串,然后再判断是否是回文数
1 | class Solution { |
或者我们可以采用第7题的方法,先将该数字反转过来,然后对比是否相等
1 | class Solution { |
10、正则表达式匹配 https://leetcode-cn.com/problems/regular-expression-matching/
本题有一个很直接的做法,我们直接采取dfs搜索的方式
1 | class Solution{ |
dp做法
dp(i,j)表示s的前i个字符和p的前j个字符是否匹配.
其实当明白了上述的递归做法后,下面的dp理解起来也非常简单。dp无法就是将之前的状态存储了起来,然后进行一个填表的过程.
1 | class Solution{ |