JAVA-高频面试题汇总:动态规划

前言

为了让小伙伴们更好地刷题,我将所有leetcode常考题按照知识点进行了归纳。

目录:

JAVA-高频面试题汇总:动态规划
JAVA-高频面试题汇总:字符串
JAVA-高频面试题汇总:二叉树(上)
JAVA-高频面试题汇总:二叉树(下)
JAVA-高频面试题汇总:回溯

JAVA-高频面试题汇总:动态规划

接下来还会进行其他模块的总结,有一起在准备暑期实习的JAVA软开伙伴可以一起交流!
小编微信: Apollo___quan

1.打家劫舍

在这里插入图片描述

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0) return 0;   //长度为0和1时要考虑,否则后面会越界
        if(nums.length==1) return nums[0];
       int[] dp = new int[nums.length];
       dp[0] = nums[0];
       dp[1] = Math.max(nums[0], nums[1]); //初始化要注意,dp[1]也要考虑max
    for(int i = 2; i < nums.length; i++){
      dp[i] = Math.max(dp[i-2] + nums[i], dp[i-1]); //转移方程
    }
    return dp[nums.length-1];
    }
}
2.连续子数组的最大和

在这里插入图片描述

这题和上一题很像,对比二者转移方程

class Solution {
    public int maxSubArray(int[] nums) {
   int[] dp=new int[nums.length];
   dp[0]=nums[0];
   int res=dp[0];
   for(int i=1;i<dp.length;i++){
       dp[i]=Math.max(nums[i],dp[i-1]+nums[i]);  //转移方程
       res=Math.max(res,dp[i]);
   }
   return res; 
    }
}
3.零钱兑换

在这里插入图片描述

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount+1];
        dp[0] = 0;
        for(int i = 1; i <= amount; i++){
            int min = Integer.MAX_VALUE; //设个最大值 为了最终确定哪些值取不到
            for(int coin:coins){
                if(coin <= i && dp[i-coin]!=-1){  // dp[i-coin]!=-1确保dp[i-coin]可以被取到
                    min = Math.min(dp[i - coin] + 1, min);  //假设i=100,要凑到100,然后依次遍历硬币值1,2,5,代表                                              了1与99的最优凑,2与98的最有凑,5与95的最优凑,+1代表该硬币的一个数量
                }
            }
            dp[i] = min == Integer.MAX_VALUE ? -1 : min;  //取不到的dp[i]就是-1
        }
        return dp[amount];
    }
}
4.最小路径和

在这里插入图片描述

 public int minPathSum(int[][] grid) {
int m = grid.length;
    int n = grid[0].length;
    if (m <= 0 || n <= 0) {
        return 0;
    }
    int[][] dp = new int[m][n];  // 初始化
    dp[0][0] = grid[0][0]; 
    for(int i = 1; i < m; i++){
      dp[i][0] = dp[i-1][0] + grid[i][0]; // 初始化最左边的列
    }

    for(int i = 1; i < n; i++){
      dp[0][i] = dp[0][i-1] + grid[0][i]; // 初始化最上边的行
    }
    for (int i = 1; i < m; i++) {
        for (int j = 1; j < n; j++) {
            dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j]; // 推导出 dp[m-1][n-1]
        }
    }
    return dp[m-1][n-1];
    }
5.矩形覆盖

https://www.nowcoder.com/questionTerminal/72a5a919508a4251859fb2cfb987a0e6

n块矩形有f(n)种覆盖方法。进行逆向分析,要完成最后的搭建有两种可能。

img

第一种情况等价于情形1中阴影部分的n-1块矩形有多少种覆盖方法,为f(n-1);

第二种情况等价于情形2中阴影部分的n-2块矩形有多少种覆盖方法,为f(n-2);

故f(n) = f(n-1) + f(n-2),还是一个斐波那契数列。。。。

且f(1) = 1, f(2) = 2,代码如下

public class Solution {
    public int RectCover(int target) {
   if(target<=2) return target;
        int a=1,b=2;
        for(int i=3; i<=target ; i++){
            int temp=a+b;
            a=b;
            b=temp;
        }
        return b;
    }
}
6.变态跳台阶

在这里插入图片描述

public int JumpFloorII(int target) {
        if(target <= 2) return target; 
       int[] dp =new int[target+1];
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        for(int m = 3; m <= target; m++){
            dp[m] = 0;
            for(int n = 0; n < m; n++){   //简便方法直接替代:   dp[m] = 2*dp[m-1];
                dp[m] = dp[m] + dp[n];   
            }
        }
        return dp[target];
    }

简便方法

在这里插入图片描述

7.不同的二叉搜索树

在这里插入图片描述

在这里插入图片描述

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0] = 1;
         dp[1] = 1;
        for(int i = 2; i <= n; i++){
            dp[i] = 0;
            for(int j = 1; j <= i; j++){
                dp[i] = dp[i] +dp[j-1]*dp[i-j];  //这里要特别注意  i和j的书写
            }
        }
        return dp[n];
    }
}

8.买卖股票的最佳时机
在这里插入图片描述

class Solution {
    public int maxProfit(int[] prices) {
        int maxprofit = 0;
        int minprice = Integer.MAX_VALUE;
        for(int i=0; i<prices.length; i++){
            if(prices[i]<minprice){
                minprice = prices[i];
            }else if(prices[i] - minprice > maxprofit){
                maxprofit = prices[i] - minprice;
            }
        }
        return maxprofit;
    }
}

总结

动态规划题型整理完毕,其余类型
JAVA-高频面试题汇总:字符串
JAVA-高频面试题汇总:二叉树(上)
JAVA-高频面试题汇总:二叉树(下)
JAVA-高频面试题汇总:回溯

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Java面试八股文:高频面试题与求职攻略一本通》是一本旨在帮助Java求职者提升面试竞争力的参考书籍。本书以高频面试题为主要内容,以求职攻略为辅助,全面涵盖了Java面试的各个方面。 首先,本书对Java基础知识进行了系统梳理。涵盖了Java的核心概念、面向对象思想、多线程、集合框架等关键知识点。通过对这些基础知识的深入解析和举例,读者能够更好地理解并掌握Java语言的精髓。 其次,本书还深入剖析了Java虚拟机(JVM)和垃圾回收机制。对于面试中经常涉及的内存模型、垃圾回收算法等内容进行了详细解读,帮助读者从深层次了解Java程序的执行和性能优化。 此外,本书还介绍了Java的常用框架和工具,如Spring、Hibernate、MyBatis等,以及一些Java开发常用的设计模式。为读者提供了在面试中展示自己综合能力的机会,同时也使得读者在实际项目开发中能够更加得心应手。 最后,本书独有的求职攻略部分为读者提供了一系列求职技巧和面试策略。包括简历编写、面试前的准备、面试中的表现技巧等方面的内容,帮助读者提高自己的求职竞争力。 综上所述,《Java面试八股文:高频面试题与求职攻略一本通》是一本综合性的面试备考书籍。通过学习本书,读者能够全面掌握Java面试的要点和技巧,提升自己在竞争激烈的求职市场中的竞争力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值