【Java算法题】剑指offer_算法之02动态规划

news/2024/12/2 19:57:52/

对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

JZ42 连续子数组的最大和

[图片]

思路:五部曲

  1. 确定dp数组(dp table)以及下标的含义
    dp[i]:包括下标i的最长连续子序和
  2. 确定递推公式
  • 加入当前array[i]的子序和 dp[i] = dp[i-1]+array[i]
  • 当前元素 array[i]
  1. dp数组如何初始化
    初始化dp[0] = array[0]
  2. 确定遍历顺序
    dp的更新需要前一个dp信息,从前往后遍历
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param array int整型一维数组 * @return int整型*/public int FindGreatestSumOfSubArray (int[] array) {// write code hereint result = array[0];//结果int[] dp = new int[array.length]; //dp数组dp[0]=array[0];for(int i=1;i<array.length;i++){//状态转移方程dp[i] = Math.max(dp[i-1]+array[i],array[i]);if(dp[i]>result){result = dp[i];}}return result;}
}

JZ85 连续子数组的最大和(二)

[图片]

思路:动态规划部分和上题一致,该题需要存储最长的子数组。
使用两个指针来记录当前最大和的区间,再用两个指针记录最长的区间,每次更新max的时候更新区间。

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param array int整型一维数组 * @return int整型一维数组*/public int[] FindGreatestSumOfSubArray (int[] array) {// write code hereint[] dp = new int[array.length];dp[0] = array[0];int max = array[0];int left=0,right=0;//滑动区间int resl=0,resr=0;//记录最长区间for(int i=1;i<array.length;i++){right++;dp[i] = Math.max(dp[i-1]+array[i],array[i]);if(array[i]>(dp[i-1]+array[i])){left=right;}if(dp[i]>max || dp[i]==max && (right-left+1)>(resr-resl+1)){ //记录最大和以及更新区间max = dp[i];resl=left;resr=right;}}int[] res = new int[resr-resl+1];for(int i=resl;i<=resr;i++){res[i-resl]=array[i];}return res;}
}

JZ69 跳台阶

[图片]

思路:

  1. dp[i]代表上i级台阶的跳法
  2. dp[i] = dp[i-1]+dp[i-2]
  3. dp[0]=1; dp[1]=1;
  4. 从前往后遍历
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param number int整型 * @return int整型*/public int jumpFloor (int number) {// write code hereint[] dp = new int[number+1];dp[0]=1;dp[1]=1;for(int i=2;i<=number;i++){dp[i] = dp[i-1]+dp[i-2];}return dp[number];}
}
JZ10 斐波那契数列
[图片]
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @return int整型*/public int Fibonacci (int n) {// write code hereif(n==1){return 1;}else if(n==2){return 1;}return Fibonacci(n-1)+Fibonacci(n-2);}
}

JZ71 跳台阶扩展问题

[图片]

import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param number int整型 * @return int整型*/public int jumpFloorII (int number) {// write code hereint[] dp = new int[number+1];dp[0]=1;dp[1]=1;for(int i=2;i<=number;i++){dp[i] = 2*dp[i-1];}return dp[number];}
}

JZ70 矩形覆盖

[图片]

[图片]

[图片]

import java.util.*;
public class Solution {public int rectCover(int target) {if(target<=2){return target;}return rectCover(target-1)+rectCover(target-2);}
}


http://www.ppmy.cn/news/498778.html

相关文章

Echarts中国地图china.json

自从升级echarts5以后就不能用依赖包里面的↓ import china from "echarts/map/json/china.json"; 直接运行npm run dev会提示报错信息&#xff1a;To install them, you can run: npm install --save echarts echarts/map/json/china.json 我这里把json文本复制出来…

R3-3200G和R3-2200G的区别

AMD锐龙R3-3200G基于12纳米工艺的Zen架构设计&#xff0c;并没有采用全新的7纳米Zen2架构&#xff0c;接口类型为AM4&#xff0c;拥有4核4线程设计 选R3-3200G和R3-2200G 这些点很重要!看完你就知道了 https://diannao.jd.com/list.html? 基础频率为3.6GHz&#xff0c;加速频率…

R3 2200G搭配显卡推荐

R3 2200配什么显卡好呢&#xff1f;伴随着八代APU处理器的发布&#xff0c;想必今年八代处理器会成为主流装机。通过之前的相关评测得知&#xff0c;这款AMD锐龙3 2200G基本上将会取代R3-1200&#xff0c;全新的处理器虽说采用相同的插槽接口&#xff0c;但性能各方面均大幅度提…

Linux查看硬盘信息方法总结

转载请注明文章出处&#xff1a;https://tlanyan.me/linux-list-disk-info-summary 本文简要总结Linux查看硬盘信息的方法&#xff0c;基本涵盖普通用户、系统管理员所能接触到的各种命令。 lsblk lsblk命令用来查看接入到系统中的块设备&#xff0c;默认输出分区、大小、挂载…

基于Echarts+HTML5可视化数据大屏展示—智慧社区内网对比平台

机缘 从初到现在已经学习快六年了,在高中的时候就很喜欢玩电脑,但却不知道电脑到底用来干嘛只知道计算机可以查阅资料 电脑游戏 电影 shopping等等&#xff0c;最初接触编程是因为我的表哥,我表哥学的计算机专业,高中是半个月放假一次,每次玩手机的时候看他朋友圈都里发那些看不…

DASCTF2022.07赋能赛Crypto_复现

DASCTF2022.07赋能赛Crypto_复现 easyNTRU keywords: 格密码私钥爆破 P r o b l e m Problem Problem from Crypto.Hash import SHA3_256 from Crypto.Cipher import AES from Crypto.Util.Padding import pad from secret import flag# parameters N 10 p 3 q 512 d 3 …

echarts中的中国地图js源码(china.js)

ECharts官方已不再提供js地图下载&#xff0c;china.js的源码如下&#xff0c;只需要新建一个js文件&#xff0c;然后将以下js代码复制进去保存即可引用&#xff0c;也不用浪费积分去下载资源 (function (root, factory) {if (typeof define function && define.amd)…

fullCalendar 使用手册

fullCalendar 使用手册 标签&#xff08;空格分隔&#xff09;&#xff1a; fullCalendar 仰仗网络&#xff1a; fullCalendar官方网站 fullCalendar改造为农历 fullCalendar的基本事件的实现 fullCalendar的基本事件的实现2 一、简述 简单的说 fullCalendar 是一个日历控件…