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

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];
    }

以上是关于学习算法过程中学到的技巧_持续更新的主要内容,如果未能解决你的问题,请参考以下文章

[工具向]__关于androidstudio工具使用过程中学习到的一些知识点简记

web后端学习过程中技巧总结(持续更新。。。)

学习如何学习(持续更新中)

从2021华中杯数学建模比赛中学到的东西整理

走读中学到的技巧

总结学习机器学习过程中用到的数据学知识