2021最新Java大厂面试题来袭,初识动态规划

动态规划就是分治的思想,通俗一点就是大事化小,小事化了。并且在将大问题化解为小问题的时候,保存对这些小问题处理好的结果,供后面处理更大规模问题去使用。

动态规划的特点:

1.把原来的问题分解成了几个相似的子问题

2.所有子问题只需要解决一边

3.存储子问题的解

动态规划问题解决步骤

动态规划的本质,是对问题状态的定义和状态方程的定义。

1.状态定义

2.状态间的转移方程定义

3.状态的初始化

4.返回结果(解或者间接解)

状态定义的要求:定义的状态一定要形成递推关系

适用场景最大最小值,可不可行,是不是,方案个数等问题。

一、Fibonacci数列

================================================================================

先对问题进行分析

1.状态定义: F(n)

2.状态间的转移方程:F(n)=F(n-1)+F(n-2);

3.状态的初始化:(初始值) F(0)=0; F(1)=1;

4.返回结果:F(n)

代码如下(示例):


 public static int Fib(int n){

        if(n<=0){

            return 0;

        }

        //从第零项开始所以多开辟一个空间

        int []dp=new int[n+1];

        dp[0]=0;

        dp[1]=1;

        for(int i=2;i<=n;i++){

            //状态转移方程

            //F(n)=F(n-1)+F(n-2)

            dp[i]=dp[i-1]+dp[i-2];

        }

        return dp[n];

   	} 

当然我们也可以不使用数组让空间复杂度达到O(1)


public static int Fib1(int n){

        if(n<=0){

            return 0;

        }

        if(n==1||n==2){

            return 1;

        }

        int f1=1;

        int f2=1;

        int f3=0;

        for(int i=3;i<=n;i++){

            f3=f1+f2;

            f1=f2;

            f2=f3;

        }

        return f3;

    } 

很多动规问题都可以转化成Fib数列解决

二、青蛙跳台阶

==========================================================================

先是变态青蛙跳台阶,有n阶台阶,青蛙可以每次跳一个,二个…或者n个

分解问题:

1.状态定义F(n)

2.状态间转移方程定义 F(n)=2F(n-1)

3.状态的初始化 F(1)=1

4.返回结果 F(n)


 public static int climbingStairs(int n){

			 int res=1;

        for(int i=2;i<=n;i++){

            //F(n)=2F(n-1)

            res*=2;

        }

        return res;

} 

之后是正常的青蛙,每次只能跳一个台阶或者两个台阶(斐波那契数列)

leetcode 70题

1.状态定义 F(n)

2.状态间转移方程定义F(n)=F(n-1)+F(n-2)

3.状态初始化 F(1)=1;

4.返回结果 F(n)


 public static int climbingStairs1(int n){

    	if(n==1||n=

你可能感兴趣的:(程序员,java,动态规划,后端)