1. 顺序遍历
逐个判断,时间O(n)
,空间O(1)
。
1 | class Solution { |
分析将一个数拆成以下部分:
拆1:没用
拆2:可以
拆3:可以
拆4:可以,跟2一样
拆5+:对半拆分后的乘积要比原来的值大
综上,尽可能拆出3,不要剩余1.
时间O(1)
,空间O(1)
。
1 | class Solution { |
使用一个辅助的单调递减栈,栈内存放数据的索引。
当当前元素大于栈顶元素时,弹出栈顶元素,并同时可以得到弹出的栈顶元素距离右侧第一个大于它的元素的位置。
当当前元素小于等于栈顶元素时,入栈。
时间O(n)
,空间O(n)
。
1 | class Solution { |
错误!!
1 | 输入: |
题目要求的是子串,而不是任意匹配即可。
求从每一个’(‘的位置开始,最长的有效括号子串的长度。
时间O(n^2)
,空间O(1)
。
1 | class Solution { |
时间O(n)
,空间O(height)
(递归栈)
1 | /** |
类似层次遍历,时间O(n)
,空间O(n)
.
遍历s和t,时间O(len(t))
,空间O(1)
。
如果短字符串s有无限多个,则可以预先处理t,得到每个位置开始下一个给定字符的最近位置,这样就可以直接跳转到下一个需要的位置了。
1 | class Solution { |
设 dp[i]
为 N = i
时Alice的胜负情况,则 dp[i]
取决于 i
的 [1, i - 1]
范围内的因数。
时间 O(n^2)
,遍历 1~n
是 O(n)
,对每个数求因数又是 O(n)
。空间复杂度 O(n)
。
1 | class Solution { |
因为不知道戳爆哪个气球得到的奖励最高,所以可以遍历i都戳戳试试。
当戳爆第i个气球时,得到nums[i - 1] * nums[i] * nums[i + 1]
的奖励,
同时把气球分为左右两部分
假设首先戳爆i~j
的气球k,则非常不好计算:
因为k被戳爆之后,左侧部分最后一个气球的戳爆依赖于右部分第一个气球,右侧部分第一个气球的戳爆依赖于左侧部分最后一个气球。
所以可以假设最后戳爆气球k,这样左右两部分就不会产生关联。
可以设dp[i][j]
是戳爆nums[i] ~ nums[j]
可得的最大收益。dp[i][j] = max_k(dp[i][k - 1] + dp[k + 1][j] + nums[i - 1] * nums[k] * nums[j + 1])
时间O(n^3)
,因为状态有O(n^2)
种,每个状态的计算是O(n)
。空间O(n^2)
。
1 | class Solution { |