1. 快速幂
时间O(logn)
,空间O(1)
。
1 | class Solution { |
时间O(logn)
,空间O(1)
。
1 | class Solution { |
时间复杂度:O(logn)
,空间复杂度O(1)
。
1 | class Solution { |
设 dp[i][j]
代表以 matrix[i][j]
为右下角的最大正方形的边长。
当 matrix[i][j] == 0
时,dp[i][j] = 0
.
当 matrix[i][j] == 1
时,dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j]) + 1
.
如果越界,则上述min取0.
matrix[i][j] == 1
的状态转移方程如上是因为:
dp[i][j]
根据 dp[i-1][j-1]
来求,则需要判断i行j列的连续的1最多有多少,然后取 min(dp[i-1][j-1], i行的1, j列的1)
再加上1就是 dp[i][j]
。dp[i][j]
根据 dp[i][j-1]
来求,则需要判断j列的连续的1最多有多少,如果j列的小,则 dp[i][j] = j列 + 1
,而如果j列的大,还需要判断 i-dp[i][j-1]
行有没有足够的1使得可以形成 dp[i][j] = dp[i][j-1] + 1
。dp[i][j]
根据 dp[i-1][j]
来求,则需要判断i行的连续的1最多有多少,如果i行的小,则 dp[i][j] = i行 + 1
,而如果i行的大,还需要判断 j-dp[i][j-1]
列有没有足够的1使得可以形成 dp[i][j] = dp[i-1][j] + 1
。如果按照上面三种之一的求法,需要在遍历到每个点的时候,最多还要判断 O(min(m, n))
次,因此时间复杂度是 O(mn*min(m, n))
。
而我们可以发现,1需要的i行j列的连续的1的个数在 dp[i][j-1]
和 dp[i-1][j]
中分别有表示,2需要的j列的连续的1在 dp[i-1][j]
中有所表示,需要的 i-dp[i][j-1]
行的1的个数在 dp[i-1][j-1]
和 dp[i][j-1]
中有所表示。
两棵树相同,则所有的节点的值和位置相同。
可以通过递归比较根左右的想等情况。
时间复杂度:遍历所有节点O(n)
.
空间复杂度:递归栈最深是O(n)
.
1 | /** |
相同的方法,不过用stack模拟递归栈来实现。
时间复杂度和空间复杂度与上述递归方法相同。
dp[i]
代表从开始到第days[i]
天(包括这一天)花费的钱。
如果求解dp[i]
是遍历到i时再去看前1天、前7天和前30天花的钱+再买票的钱是没法计算的,因为前面的那些天已经买票了,即30天前的那一天可能已经花钱买了30天的票,如果再+票钱的话,就多余了。
所以就需要在dp[i]
这天买票的时候,就将之后的在票范围内的dp[j]
更新掉。
遍历到每一天days[i]
,我们都假设这一天没有旅游,需要买票(加上上次旅游花的钱即dp[i-1]
),并把买票之后可以访问到的dp[j]
更新。
这样就可以得到每一个days[j]
之前的天数花费一定的票费到达days[j]
这一天。
如果是访问到days[i]
这天发现已经通过之前的票旅游过了,那么这就是从开始到days[i]
天花费的最少的钱。
而如果访问到days[i]
这天,发现之前旅游买票还没有能长到这天的(即dp[i] == INT32_MAX
时),就根据旅游到前一次花费的最少的钱dp[i-1]
来更新dp[i]
。
中序遍历:左根右
可以用递归实现,也可以用栈模拟递归栈来迭代实现,这里用迭代实现。
时间复杂度:遍历所有的节点,O(n)
。
空间复杂度:递归栈,深度最大O(n)
。
1 | /** |
dp[i]
记录从开始到nums[i]
节点需要的最少的跳数,则状态转移方程:dp[i] = min(dp[j] + 1), if (j < i && j + nums[j] >= i)
时间O(n^2)
,空间O(n)
。
超时。
1 | class Solution { |
可以在访问到i节点的时候,将其可以访问到的右侧的节点的dp[j]
更新。
而由于定义的dp[i]
数组一定是随着i的增加而增大的,所以之后的dp[j]
只需要更新第一次即可。
由于只需要更新一次dp数组,所以时间复杂度是O(n)
,空间复杂度也是O(n)
.
bool reach[]
记录是否可以到达。
遍历nums[i]
,将其可以到达的位置置为true。时间复杂度是O(n)
,因为就算修改reach[]
是O(n)
,但是还是可能会去访问后续的元素(即使没有修改),导致需要的时间很长。空间复杂度O(n)
。
1 | class Solution { |
考虑题目要求,由于可走的长度是>=0的,因此可以直接记录最远的距离,而最远距离左侧的距离一定可达。
当当前距离超过最远距离时,意味着当前距离无法到达。
时间复杂度O(n)
,空间复杂度O(1)
。
1 | class Solution { |
当窗口内的值为正时,右边界一直向右移动(因为左侧总是可以作为正数部分)
当窗口内的值为负时,左边界跳过右边界(因为左侧已经是负数了)
时间O(n)
,空间O(1)
。
1 | class Solution { |