1. 二分
要求复杂度是O(logn)
,说明了是要二分。
结果只要求一个值,因此二分到nums[i-1] < nums[i] < nums[i+1]
的i即可。
1 | class Solution { |
要求复杂度是O(logn)
,说明了是要二分。
结果只要求一个值,因此二分到nums[i-1] < nums[i] < nums[i+1]
的i即可。
1 | class Solution { |
第一反应是双指针,s3判断一个,对应的s1或者s2向后移一位。
但问题在于,当s1和s2的当前位相同时,无法确定s1/s2向后移位。
如果加上回溯,则跟递归类似。
复杂度指数级。
可以通过记忆化降低复杂度。
1 | class Solution { |
f[i][j]
代表s1的前i个字符和s2的前j个字符是否符合s3的前i+j个字符。
设G(n)
是以1 … n为节点组成的二叉搜索树的种数,f(i)
是以i为根节点的二叉搜索树的种数,则有:G(n) = f(1) + f(2) + ... + f(n)
以f(i)
为例,其左子树为1 … i-1节点组成的二叉搜索树,右子树为i+1 … n节点组成的二叉搜索树,即f(i) = G(i - 1) * G(n - i)
综上,有:G(n) = G(0)G(n-1) + G(1)G(n-2) + ... + G(n-1)G(0)
时间复杂度:(n^2)
,需要算n个G(i)
,每个需要O(n)
。
空间复杂度:O(n)
。
1 | class Solution { |
首先判断不删除字符的情况下,s本身是不是回文串。
之后遍历判断删除每个字符,剩下的部分是否是回文串。
时间O(n^2)
,空间O(1)
,超时。
1 | class Solution { |
初始双指针指在s的左右两侧。
直接hash表记录次数,但是空间占用有点多。
时间O(n)
,空间O(n)
.
1 | class Solution { |
偶数个相同的数据异或之后变成0,而任何数异或0还是它本身。
时间O(n)
,空间O(1)
。
左根右直接递归实现。
时间O(n)
,空间O(n)
.
1 | /** |
跟二叉树一样,时间O(n)
,空间O(n)
。
1 | /* |
时间O(n)
,空间O(n)
。
1 | /** |
用一个变量记录最小元素的位置就可以了。
1 | class MinStack { |
用一个辅助栈记录过程中的最小值,用额外O(n)
的空间将pop()
的复杂度降低为O(1)
。
以下两种方式都可以: