简介
目前收录了共[76]道必会题
目录
1.回溯算法
1.1 二维搜索问题
这种问题已经属于已经定式的解法,核心就是上下左右移动以及海洋包围城市
1.2 全排列问题
- 打印从1到最大的n位数
- 手机打字的
1.3 组合问题
1.4 子集问题
2.动态规划
2.1递推问题
- 斐波那契问题
dp[i] = dp[i-1]+dp[i-2] - 把数字翻译成字符串
d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] ( atoi ( sub str ( i , 2 ) ) < = 25 & & atoi ( substr ( i , 2 ) ) > = 10 ) = d p [ i − 2 ] ( atoi ( substr ( i , 2 ) ) > 25 & & atoi ( substr ( i , 2 ) ) < 10 ) \begin{aligned} \mathrm{dp}[\mathrm{i}] &=\mathrm{dp}[\mathrm{i}-1]+\mathrm{dp}[\mathrm{i}-2](\text { atoi }(\operatorname{sub} \operatorname{str}(\mathrm{i}, 2))<=25 \& \& \text { atoi }(\operatorname{substr}(\mathrm{i}, 2))>=10) \\ &=\mathrm{dp}[\mathrm{i}-2](\text { atoi }(\operatorname{substr}(\mathrm{i}, 2))>25 \& \& \text { atoi }(\operatorname{substr}(\mathrm{i}, 2))<10) \end{aligned} dp[i]=dp[i−1]+dp[i−2]( atoi (substr(i,2))<=25&& atoi (substr(i,2))>=10)=dp[i−2]( atoi (substr(i,2))>25&& atoi (substr(i,2))<10) - 青蛙跳台阶
dp[i] = dp[i-1]+dp[i-2]
2.2 累加问题
-
最长斐波那契
dp [ i ] [ j ] = max ( d p [ k ] [ i ] + 1 , d p [ i ] [ j ] ) \operatorname{dp}[i][j]=\max (d p[k][i]+1, d p[i][j]) dp[i][j]=max(dp[k][i]+1,dp[i][j]) -
最长递增子序列
dp [ i ] = max ( dp [ i ] , d p [ j ] + 1 ) \operatorname{dp}[\mathrm{i}]=\max (\operatorname{dp}[\mathrm{i}], \mathrm{dp}[\mathrm{j}]+1) dp[i]=max(dp[i],dp[j]+1) -
最大正方形
d p [ i ] [ j ] = min ( min ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − 1 ] ) , d p [ i ] [ j − 1 ] ) + 1 d p[i][j]=\min (\min (d p[i-1][j], d p[i-1][j-1]), d p[i][j-1])+1 dp[i][j]=min(min(dp[i−1][j],dp[i−1][j−1]),dp[i][j−1])+1 -
兑换零钱
dp [ i ] = min ( d p [ i ] , d p [ i − k ] + 1 ) \operatorname{dp}[\mathrm{i}]=\min (d p[i], d p[i-k]+1) dp[i]=min(dp[i],dp[i−k]+1) -
剪绳子
d p [ i ] = m a x ( d p [ i ] , m a x ( ( i − j ) ∗ j , d p [ i − j ] ∗ j ) ) dp[i] = max(dp[i],max((i-j)*j,dp[i-j]*j)) dp[i]=max(dp[i],max((i−j)∗j,dp[i−j]∗j)) -
礼物的最大价值
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) + g r i d [ i − 1 ] [ j − 1 ] dp[i][j] = max(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1] dp[i][j]=max(dp[i−1][j],dp[i][j−1])+grid[i−1][j−1] -
打家劫舍
d p [ i ] = m a x ( d p [ i − 2 ] + n u m s [ i ] , d p [ i − 1 ] ) ; dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); dp[i]=max(dp[i−2]+nums[i],dp[i−1]);
2.3 最优选择[极值]
- 买入和卖出两种状态
d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 1 ] − p r i c e s [ i ] , d p [ i − 1 ] [ 0 ] ) ; dp[i][0] = max(dp[i-1][1] - prices[i],dp[i - 1][0]); dp[i][0]=max(dp[i−1][1]−prices[i],dp[i−1][0]);
d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 0 ] + p r i c e s [ i ] , d p [ i − 1 ] [ 1 ] ) ; dp[i][1] = max(dp[i-1][0] + prices[i],dp[i - 1][1]); dp[i][1]=max(dp[i−1][0]+prices[i],dp[i−1][1]); - 包含买入,卖出,冷冻期
d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 1 ] − p r i c e s [ i ] , d p [ i − 1 ] [ 0 ] ) ; d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 1 ] [ 2 ] ) ; d p [ i ] [ 2 ] = d p [ i − 1 ] [ 0 ] + p r i c e s [ i ] ; dp[i][0] = max(dp[i-1][1] - prices[i],dp[i-1][0]);\\ dp[i][1] = max(dp[i-1][1],dp[i - 1][2]);\\ dp[i][2] = dp[i-1][0] + prices[i]; dp[i][0]=max(dp[i−1][1]−prices[i],dp[i−1][0]);dp[i][1]=max(dp[i−1][1],dp[i−1][2]);dp[i][2]=dp[i−1][0]+prices[i]; - 连续数组的最大和
n u m s [ i ] + = m a x ( n u m s [ i − 1 ] , 0 ) ; nums[i] += max(nums[i - 1],0); nums[i]+=max(nums[i−1],0);
2.5 背包问题
2.5.1 0,1背包问题
-
分割等和子集
d p [ i ] [ j ] = d p [ i − 1 ] [ j − n u m s [ i ] ] ∣ ( o r ) d p [ i − 1 ] [ j ] ; j > = n u m s [ i ] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ; j < n u m s [ i ] dp[i][j] = dp[i - 1][j-nums[i]]|(or)dp[i-1][j];j>=nums[i] \\ dp[i][j] = dp[i-1][j];j<nums[i] dp[i][j]=dp[i−1][j−nums[i]]∣(or)dp[i−1][j];j>=nums[i]dp[i][j]=dp[i−1][j];j<nums[i] -
d p [ i ] [ j ] [ k ] = m a x ( d p [ i ] [ j ] [ k ] , d p [ i − 1 ] [ j − z e r o s ] [ k − o n e s ] + 1 ) ; dp[i][j][k] = max(dp[i][j][k], dp[i - 1][j - zeros][k - ones] + 1); dp[i][j][k]=max(dp[i][j][k],dp[i−1][j−zeros][k−ones]+1);
-
目标和
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − n u m s [ i ] ] ; j > = n u m s [ i ] d p [ i ] [ j ] = d p [ i − 1 ] [ j ] ; j < n u m s [ i ] dp[i][j] = dp[i - 1][j]+dp[i - 1][j - nums[i]];j>=nums[i] \\ dp[i][j] = dp[i - 1][j];j<nums[i] dp[i][j]=dp[i−1][j]+dp[i−1][j−nums[i]];j>=nums[i]dp[i][j]=dp[i−1][j];j<nums[i]
2.5.2 完全背包问题
3.数组常规性问题
3.1 基础类型的空间换时间
3.1.1 使用hash降低时间复杂度
3.1.2 使用vector降低时间复杂度
3.2 滑动窗口降低时间复杂度
3.3 排序降低空间复杂度和时间复杂度
3.4 中心扩展法
3.5 前缀和问题
3.6 双指针法
3.7 二分法
3.8 连乘连加[三角技巧]
3.9 概率问题
3.10 排序
- 冒泡
- 快排
- 归并
- 堆排序
4.树
4.1 二叉搜索树性质
4.2 平衡二叉树性质
4.3 最近公共祖先
4.4 建树
- 根据先序和中序遍历建立二叉树
- 根据升序链表重建二叉搜索树
- 根据后序和中序遍历建立二叉树
- 根据先序建立二叉树
4.5 遍历
- 二叉树的前序遍历[队列]
- 中序遍历[栈]
- 后序遍历[先序反遍历]
5.链表
4.1 链表翻转
4.2 环问题
- 判断是否存在环
- 判断环的位置
4.3 交点
- 判断是否存在交点
- 求交点的位置
4.4 求和
6. 贪心问题
贪心问题的核心在于每一步都想要最好的,
比如剪绳子2,我每一步都希望积最大,所以我挑选每一次都在3的位置噶一刀,
比如A*算法,我每一次都沿着里面目标的距离最小的进行移动
7. 乱七八糟的题目
7.1 字典序问题
7.2 位运算问题
7.3 数学推导
7.4 模拟
7.5 一些内部库函数的实现
- 不依赖加减乘除实现加法和减法
- 不依赖pow实现幂函数[快速幂]
7.6 一些代码特性
8.队列
8.1 双向队列
9.大顶堆与小顶堆
- 会议室|
- 会议室||