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 { |