bfs O(n) time O(logn) space
1 | /** |
bfs O(n) time O(logn) space
1 | /** |
bfs O(r*c*(r*c)!) time O(r*c*(r*c)!) space
这道题也可以用A*算法
1 | class Solution { |
1 | class Solution { |
1 | class Solution { |
dp O(n) time O(1) space
看到这道题首先应该想到53. Maximum Subarray所以是dp
难点在于乘积受负数影响,只找最大乘积是行不通的,比较tricky的地方是要维护最大乘积和最小乘积,然后分情况对正负数进行讨论,讨论的思路和求最大和一致
mn和mx分别表示以x为结尾的连续子数组的最小和最大值
1 | class Solution { |
O(n*target)
把问题转换成真正的类背包问题
原来是每个数+或者-,现在每个数都乘2,这样就变成0个或者1个,也就是加这个数或者不加这个数
1 | class Solution { |
1 | class Solution { |
因为转换后的背包问题要求原来的所有数都要double,则新的target = sum + S也必须是个偶数,这样其实不需要修改nums,只需要把新的target除2即可,前提是target必须是偶数
1 | class Solution { |
二分O(logn)
1 | class Solution { |
bfs O(n) 有向图连通性
1 | class Solution { |
greedy O(m+n) time
f[i][c]表示在source中从下标i开始第一次出现的字母c在source中的下标,这样做可以跳过中间不符合要求的那些字母方便快速查找
1 | class Solution { |
greedy O(m*n) time
worst case比如[“abcd”, “ddddd”]
1 | class Solution { |
1 | class Solution { |
dp O(m*m+(n-m)*n) time
f[i]表示target前i个字符需要几个source的子序列才能构成
1 | class Solution { |
backtracking time O(2n) space O(n)
每次递归的深度是O(n)
先找到target,然后对数组从大到小排序,用回溯试数即可
1 | class Solution { |
最快版本
1 | class Solution { |
1 | class Solution { |
状态压缩dp O(n*2n) time O(2n) space
f[state]表示该state所指的这些数可以凑成多个和为target的partition外加一个和小于等于target的一部分,target是sum/k
s[state]为对应state所指的这些数构成的和
f[0] = true
对于每个state从小到大尝试加数看能不能凑成新的和为target的partition,即使不能凑成,能缩小gap也行,因为已知总和一定能被k和target整除
1 | class Solution { |
O(n) time O(n) space
跟863. All Nodes Distance K in Binary Tree类似
把树转成图再bfs找最近端点,如果只有k一个点,则图为空,返回k,如果k只有一个邻居且k不是根,则k一定是叶子,返回k,如果图中某个『最近』端点不是根,返回该点
1 | /** |
O(n) time O(n) space
小数在左边,大数在右边,对于右边每一个大数,尽可能找到左边第一个比大数小的数,所以在左边维护一个递减栈,所有可能的小数一定在这个栈里
greedy从后往前遍历每个数,对于每个数要找到从左边开始第一个不大于它的数,保存每个数字第一次出现的位置,而且依次只用保留最小的即可,比如[6, 0, 3],只需要保存6和0即可,3在0的右边且大于0,则3永远不可能成为最优解,所以可以直接跳过
1 | class Solution { |
O(nlogn) time O(n) space
1 | class Solution { |
1 | class Solution { |