我的算法提纲

倍增

用于解决 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值