学习算法过程中学到的技巧_持续更新
Posted 尚墨1111
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习算法过程中学到的技巧_持续更新相关的知识,希望对你有一定的参考价值。
1. 套路1:
一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。
比如这些题目:
2. 技巧2: 成环的题目对于索引的控制:i%len
比如:
134. 加油站
圆环回原点问题
题目描述:圆环上有10个点,编号为0~9。从0点出发,**每次可以逆时针和顺时针走一步,问走n步回到0点共有多少种走法。**举例:
- 如果n=1,则从0出发只能到1或者9,不可能回到0,共0种走法
- 如果n=2,则从0出发有4条路径:0->1->2, 0->1->0, 0->9->8, 0->9->0,其中有两条回到了0点,故一共有2种走法
类似与爬楼梯缩小规模的思路,爬上n阶楼梯 = 爬上n-1阶楼梯数+爬上n-2阶楼梯数
走
n
步到0
的方案数 = 走n-1
步到1
的数 + 走n-1
步到9
的数
dp[i][j] = 走i步到j的方案数, = 走i-1步到j-1处的数 + 走i-1到j+1处的数
但是因为是○,所以通过取余来避免越界,(j-1+len)%len,(j+1)%len====>
防止越界的思想可以好好学习
dp[i][j] = dp[i-1][(j-1+len)%len]+dp[i-1][(j-1)%len]
public int circlePath(int step,int len){
// 特殊情况的排除
if(len==0){
return 1;
}
if(len==2){
return step%2==0?1:0;
}
// 1.dp[i][j]表示走i步到达j的方法数,所以i<step+1,j<len
int[][] dp = new int[step+1][len];
// 2.对于特殊情况的处理
dp[0][0] = 1;
for (int i = 1; i <= step; i++) {
for (int j = 0; j < len; j++) {
dp[i][j] = dp[i-1][(j-1+len)%len] + dp[i-1][(j+1)%len];
}
}
return dp[step][0];
}
以上是关于学习算法过程中学到的技巧_持续更新的主要内容,如果未能解决你的问题,请参考以下文章