算法
倍增
用于解决 o ( n ) o(n) o(n)复杂度情况下的优化问题,例如从0跳至7,一般思路为0,1,2,3…7,而使用倍增的话,解决方案可以是0,4,6(4+2),7(6+1).
问题:LCA问题
1.建立从当前位置出发,在2的倍数范围内能跳到的位置,例如f(1,2)=5代表从1出发,跳跃
2
2
2^2
22格能跳到第五格。
双指针
Leetcode26. 删除排序数组中的重复项
排序
选择排序
插入排序
快速排序
搜索
二分搜索
宽度优先搜索
深度优先搜索
贪心算法
递归算法
动态规划
最长上升子序列
dp[m]=max(dp[j])+1 if nums[m]>nums[j]
最大子序列和
dp[m]=dp[m-1]+nums[m] if nums[m]>0
dp[m]=dp[m-1] if nums[m]<0
最长相似子序列
dp[m][n]=dp[m-1][n-1]+1 if(string1[m]==string2[n]
if(string1[m]==string2[n]
dp[m][n]=max(dp[m-1][n]+dp[m][n-1])
背包问题
01背包
完全背包
状态压缩动态规划
集合
并查集
类群并查集
哈希集
剪枝
部分内容来自: CNBLOGS.
可行性剪枝(不可行)
当当前状态和题意不符,并且由于题目可以推出,往后的所有情况和题意都不符,那么就可以进行剪枝,直接把这种情况及后续的所有情况判负,直接返回。
排除等效冗余(相同的)
相同效果的即可省略
最优性剪枝(有比较)
当明显不优的时候,立刻回溯
顺序剪枝(有顺序)
有明显单调性的时候,使用顺序剪枝
记忆化(搜重复的)
就是记录搜索的每一个状态,当重复搜索到相同的状态的时候直接返回。
数学
求最大公约数
int gcd(int m,int n)//辗转相除法
{
if(n!=0)
gcd(n,m%n);
else
printf("%d",m);
}