当前位置: 代码网 > it编程>编程语言>Java > 初识动态规划

初识动态规划

2024年07月31日 Java 我要评论
对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)Java面试精选题、架构实战文档你的支持,我的动力;祝各位前程似锦,offer不断!《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />

}

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

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(n1||n2){

return n;

}

int f1=1;

int f2=2;

int f3=0;

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

f3=f1+f2;

f1=f2;

f2=f3;

}

return f3;

}

三、矩阵覆盖

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

题目链接

分析问题后依旧是斐波那契数列

1.状态定义 f(n)

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

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

4.返回结果 f(n)

public static int rectcover(int target) {

if(target1||target2){

return target;

}

int t1=1;

int t2=2;

int t3=0;

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

t3=t1+t2;

t1=t2;

t2=t3;

}

return t3;

}

}

或者使用数组记录

public static int rectcover1(int target){

if(target==0){

return 0;

}

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

dp[0]=1;

dp[1]=2;

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

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

}

return dp[target-1];

}

四、最大连续字数组和

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

leetcode 53题

这种题使用动态规划来做的话就和前面几个不相同了,因为其无法定义状态间转移方程

所以就把大问题化成先问题去解决

例如求最大连续字数组和,先求前i个最大字数组的和,最终求最大连续字数组和

时间复杂度o(n),空间复杂度o(1)做法

public int maxsubarray(int[] nums) {

int res=nums[0];

for(int i=1;i<nums.length;i++){

//比较当前值和当前值加上前一个值的大小

nums[i]=math.max(nums[i-1]+nums[i],nums[i]);

res=math.max(nums[i],res);

}

return res;

}

或者另外一种如果前i项最大子序和<=0就重新赋值为下一个数值,记录max最大值

public static int maxsubarray(int[] nums) {

int max=nums[0];

int count=nums[0];

for(int i=1;i<nums.length;i++){

if(count<=0){

count=nums[i];

}else {

count+=nums[i];

}

max=math.max(max,count);

}

return max;

}

五、字符串分割

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

题目链接

先把大问题化成小问题 前i个字母能否成功分割

状态转移方程是 j<i&&f(j)&&[j,i-1] 即f(j)为true [j,i-1]也为true 这样可以存储true

例如:给定s=“nowcode” 已知 now 和code 在词典中,在找到cow后就可以从j+1位置找到 i位置单词是否能在词典中找到

举例说明:

public boolean wordbreak(string s, set dict) {

if(s.length()==0){

return true;

}

boolean[]array=new boolean[s.length()+1];

for(int i=1;i<=s.length();i++){

//1~i整体范围是一个单词

if(dict.contains(s.substring(0,i))){//substring 是从0到i-1位置

array[i]=true;

continue;

}

for(int j=i-1;j>0;j–){

//部分判断 一部分为前面验证过的true 判断后面的也为true

if(array[j]&&dict.contains(s.substring(j,i))){//substring 是从j位置到i-1位置

array[i]=true;

break;

}

}

}

return array[s.length()];

}

leetcode 139题

也是这样的字符串拆分 双80%

public boolean wordbreak(string s, list worddict) {

boolean []array=new boolean[s.length()+1];

for(int i=1;i<=s.length();i++){

if(worddict.contains(s.substring(0,i))){

array[i]=true;

continue;

}

for(int j=i-1;j>0;j–){

if(array[j]&&worddict.contains(s.substring(j,i))){

array[i]=true;

break;

}

}

}

return array[s.length()];

}

六、三角矩阵求最短路径

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

牛客题目链接

leetcode 120题

给定一个三角矩阵,找出自顶向下的最短路径和,每一步可以移动到下一行相邻的数字

首先确定相邻元素的概念:

1.如果在f(i,j)下一行相邻元素就是 (i+1,j)(i+1,j+1)

如果从下往上推的话,从f(i,j)位置往上的相邻位置就是(i-1,j)(i-1,j-1)

2.状态转移方程是 f(min)=math.min(f(i-1,j),(i-1,j-1))+a(i,j)// 从相邻位置中找到最小值,之后加上当前位置坐标

注意每一行的第一列和最后一列只有一条路径

第一列f(i,0)=f(i-1,0)+a[i][0]

最后一列 f(i,i)=f(i-1,i-1)+a[i][i]

3.初始状态

f(0,0)=a[0][0]

最终思想是从上往下求(先判断边界情况,第一列只有一条路径,最后一列也只有一条路径都加上当前坐标值就好,)之后找最小路径值就可以了。

public int minimumtotal(list<list> triangle) {

list<list> list=new arraylist<>();

for(int i=0;i<triangle.size();i++){

list.add(new arraylist<>());

}

//先定义初始值 在0位置加上(0,0)坐标的值

list.get(0).add(triangle.get(0).get(0));

//之后遍历判断特殊情况 每一行的第一个 ,每一行的最后一个

for(int i=1;i<triangle.size();i++){

int count=0;//当前路径和

for(int j=0;j<=i;j++){

if(j==0){

count=list.get(i-1).get(j);

}else if(i==j){

count=list.get(i-1).get(j-1);

}else {

count=math.min(list.get(i-1).get(j),list.get(i-1).get(j-1));

}

list.get(i).add(triangle.get(i).get(j)+count);

}

}

//之后找到list中到目标路径的最小值即可

int len=triangle.size();

int min=list.get(len-1).get(0);

for(int i=1;i<len;i++){

min=math.min(min,list.get(len-1).get(i));

}

return min;

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。

深知大多数java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注java获取)

img

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

image

java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!
《一线大厂java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》
/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

[外链图片转存中…(img-3bn0fqih-1712364577893)]

java面试精选题、架构实战文档

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!
《一线大厂java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com