学习算法过程中学到的技巧_持续更新

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]

image-20210928155248548
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];
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值