首页 > 编程语言 >Java常见面试题分享-用Java实现LIS(最长递增子序列)算法

Java常见面试题分享-用Java实现LIS(最长递增子序列)算法

时间:2024-06-17 10:57:35浏览次数:29  
标签:10 面试题 Java 递增 元素 41 LIS 序列 最长

问题描述

编写一个函数,该函数接受一个整数列表作为参数,计算这个列表的最长递增子序列(LIS)的长度,这个也是动态规划中常见的问题。

举一个典型的场景:

用来查找股票价格的最大增长,比如股票价格是[12, 13, 11, 14, 15, 16, 10, 9, 8, 7], 股票价格的最大增长是[12, 13, 14, 15, 16],最大增长的长度是5

通过查找出股票价格的最大增长,可以将这部分数据进行标注,找出股票价格的连续增长的趋势。

测试代码

int[] arr = { 10, 22, 9, 33, 21, 50, 41, 60, 80 };
assertEqual(lis(arr), 6, "1");

int[] arr1 = { 12, 13, 11, 14, 15, 16, 10, 9, 8, 7 };
assertEqual(lis(arr1), 5, "2");

int[] arr2 = { 10, 9, 2, 3, 4, 1 };
assertEqual(lis(arr2), 3, "3");

解决思路

在最长递增子序列(Longest Increasing Subsequence,简称 LIS)的定义中,子序列的元素不需要在原数组中连续。它们可以在原数组中的任何位置,只要它们的相对顺序保持不变。
对于数组 {10, 22, 9, 33, 21, 50, 41, 60, 80},其最长递增子序列为 {10, 22, 33, 50, 60, 80}。这个子序列并不包括 41,因为 41 小于它前面的元素50

在这个子序列中,每个元素都大于它前面的元素,所以它是递增的。并且这个子序列的长度(6)是所有递增子序列中最长的,所以它是最长递增子序列。

在计算最长递增子序列时,我们并不是简单地从数组的开始到结束检查每个元素。相反,我们使用一个动态规划的方法,对于每个元素,我们都检查它前面的所有元素,看看是否可以通过添加当前元素来延长一个已经存在的递增子序列。

这就是为什么 41 没有被包括在最长递增子序列中的原因,因为它不能延长任何已经存在的递增子序列。

代码实现

标签:
10,面试题,Java,递增,元素,41,LIS,序列,最长
From: https://blog.csdn.net/ruzhila/article/details/139731372

相关文章

  • 后端面试题分享-密码强度检查器
    问题描述编写一个函数,该函数接受一个字符串作为参数,检查该字符串是否符合密码强度要求,返回True或False。要求密码强度要求如下:不能小于6个字符必须出现大写、小写、数字、特殊字符(!@#$%^&*_-)的组合不能出现4个连续的字符,比如1234,dcba这样的规则建议使用正则表达式来......
  • 持续性学习-Day18(JavaWeb)
    JavaWeb1、基本概念web开发:web,表示可以从互联网上拿到一定的资源静态webhtml、css提供给所有人看的数据,始终不会发生变化动态web每个人在不同时间、不同地点,看到的信息各不相同技术栈:servlet/JSP、ASP、PHP在Java中,动态web资源开发的计数统称为Java......
  • JavaScript 面试问题及答案
    什么是JavaScript模块?答: JavaScript模块是可重复使用的代码片段,可以在文件之间导入和导出,从而提高模块化和可维护性。解释原型链的概念。答:原型链是JavaScript中的一项功能,它允许对象通过原型链从其他对象继承属性和方法。什么是高阶函数?答:高阶函数是可以将其他函数作......
  • 将本地jar引入到java工程中的三种方式
    方式一、IDEA->File->ProjectStructure->Modules->Dependencies->+->JARsorDirectories方式二、如要添加的jar文件较多,可创建目录,例:resources->libs,然后用方式一,选择此目录。方式三、如果项目是maven工程,可以通过修改pom文件,将本地jar引用工程中,如下所示<depende......
  • 高级前端的 25 个常用 JavaScript 单行代码
    1.不使用临时变量来交换变量的值例如我们想要将 a 于 b 的值交换leta=1,b=2;//交换值[a,b]=[b,a];//结果:a=2,b=1这行代码使用数组解构赋值的方式来交换两个变量的值,无需定义新的临时变量。这个巧妙的技巧可让代码看起来更简洁明了。语法[a,b......
  • Java的I/O模型
    Java的I/O发展简史从JDK1.0到JDK1.3,Java的I/O类库都非常原始,很多UNIX网络编程中的概念或者接口在I/O类库中都没有体现,比如Pipe、Channel、Buffer和Selector等。2002年发布JDK1.4时,NIO以JSR-51的身份正式随JDK发布。它新增加了java.nio包,提供了很多进行异步I/O开发的API和类库......
  • 浅拷贝、深拷贝与序列化【初级Java必需理解的概念】
    浅拷贝首先创建两个类,方便理解浅拷贝@DataclassStudentimplementsCloneable{//年龄和名字是基本属性privateintage;privateStringname;//书包是引用属性privateBagbag;publicStudent(intage,Stringname,Bagbag){this.......
  • Java 6.16 DeepClone and ShallowClone
    浅克隆:复制对象的引用地址,导致克隆对象和原始对象共享引用类型字段的实际对象。classPersonimplementsCloneable{Stringname;Addressaddress;publicPerson(Stringname,Addressaddress){this.name=name;this.address=add......
  • Java - function
     Java-Assignment04(100pts)InstructionsWriteeachexerciseinitsownmethod.Uncommentthefunctioncallsinmain()toactivateeachexercise.Referto"Assignment01"ifnecessary.Foreachexercise,usecommentstowritepseudocodew......
  • 面试官:Java中缓冲流真的性能很好吗?我看未必
    一、写在开头上一篇文章中,我们介绍了JavaIO流中的4个基类:InputStream、OutputStream、Reader、Writer,那么这一篇中,我们将以四个基类所衍生出来,应对不同场景的数据流进行学习。二、衍生数据流分类我们上面说了java.io包中有40多个类,都从InputStream、OutputStream、Reader、Wr......