Java手写最长递增子序列算法和最长递增子序列算法应用拓展案例

Java手写最长递增子序列算法和最长递增子序列算法应用拓展案例

1. 算法思维

最长递增子序列算法的实现原理如下:

  1. 创建一个长度与原始序列相同的动态规划数组dp,用于记录以每个元素为结尾的最长递增子序列的长度。
  2. 初始化dp数组的所有元素为1,因为每个元素本身可以作为一个长度为1的递增子序列。
  3. 从左到右遍历原始序列,对于当前的元素nums[i],再从开头到当前元素之前的元素j进行遍历:
    • 如果nums[i]大于nums[j],说明可以将nums[i]接在以nums[j]结尾的递增子序列后面,形成一个更长的递增子序列。此时更新dp[i]的值,将其更新为dp[j] + 1。
    • 如果nums[i]小于等于nums[j],则无法将nums[i]接在以nums[j]结尾的递增子序列后面,不做任何操作。
  4. 在整个dp数组中找到最大值,即为最长递增子序列的长度。

以下是对应的步骤的Java代码实现:

public int lengthOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];Arrays.fill(dp, 1);int maxLength = 1;for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}maxLength = Math.max(maxLength, dp[i]);}return maxLength;
}

这就是最长递增子序列算法的基本实现原理。通过记录每个元素结尾的最长递增子序列的长度,最终找到整个序列中最长的递增子序列的长度。根据具体的应用场景,也可以对算法进行扩展和优化,例如求出最长递增子序列的具体内容等。

2. 最长递增子序列算法的手写必要性和市场调查

手写最长递增子序列算法有以下必要性:

  • 理解算法的实现原理,提高编程能力;
  • 实现自定义需求,满足特定业务场景的要求;
  • 学习算法思想,为解决其他问题提供思路。

市场调查显示,最长递增子序列算法在以下领域有广泛应用:

  • 数据分析和处理;
  • 金融和股票交易;
  • 字符串匹配和搜索;
  • 图像处理和识别。

3. 最长递增子序列算法的详细介绍和步骤

最长递增子序列算法的目标是找到给定序列中最长的递增子序列。以下是该算法的详细步骤:

步骤1: 创建一个长度为n的数组dp,用于存储以每个元素为结尾的最长递增子序列的长度。

步骤2: 初始化dp数组的所有元素为1,表示以每个元素为结尾的最长递增子序列的长度至少为1。

步骤3: 遍历数组,对于每个元素arr[i],从0到i-1依次判断arr[i]是否可以接在arr[j]后面形成递增子序列,如果可以,则更新dp[i]的值为dp[j]+1。

步骤4: 遍历dp数组,找到其中的最大值,即为最长递增子序列的长度。

步骤5: 通过回溯法找出最长递增子序列的具体元素,具体步骤如下:

  • 初始化最长递增子序列为一个空数组;
  • 从dp数组中找到最大值的索引maxIndex;
  • 从maxIndex开始往前遍历dp数组,找到第一个满足dp[i] + 1 = dp[maxIndex]的索引i,将arr[i]加入最长递增子序列;
  • 将i更新为maxIndex,继续往前遍历,重复上述步骤,直到i为-1。

4. 最长递增子序列算法的手写实现总结和思维拓展

通过手写最长递增子序列算法,我们深入理解了算法的实现原理和应用场景。该算法的核心思想是动态规划,通过构建dp数组记录以每个元素为结尾的最长递增子序列的长度,最终找到最长递增子序列。

思维拓展:在实际应用中,我们还可以将最长递增子序列算法进行改进,例如使用二分查找优化算法的时间复杂度。

5. 最长递增子序列算法的完整代码

public class LongestIncreasingSubsequence {public static int lengthOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];Arrays.fill(dp, 1);for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);}}}int maxLength = 0;for (int i = 0; i < n; i++) {maxLength = Math.max(maxLength, dp[i]);}return maxLength;}public static List<Integer> getLIS(int[] nums, int[] dp) {int maxLength = 0;int maxIndex = 0;for (int i = 0; i < dp.length; i++) {if (dp[i] > maxLength) {maxLength = dp[i];maxIndex = i;}}List<Integer> lis = new ArrayList<>();int index = maxIndex;while (index >= 0) {if (dp[index] == maxLength) {lis.add(nums[index]);maxLength--;}index--;}Collections.reverse(lis);return lis;}public static void main(String[] args) {int[] nums = {10, 9, 2, 5, 3, 7, 101, 18};int[] dp = new int[nums.length];int maxLength = lengthOfLIS(nums);List<Integer> lis = getLIS(nums, dp);System.out.println("Length of Longest Increasing Subsequence: " + maxLength);System.out.println("Longest Increasing Subsequence: " + lis);}
}

6. 最长递增子序列算法的应用前景调研

最长递增子序列算法在以下领域有广泛的应用前景:

  • 数据分析和处理:通过找到最长递增子序列,可以揭示数据中的潜在趋势和规律,为数据分析和处理提供基础。
  • 金融和股票交易:通过分析股票价格的最长递增子序列,可以预测股票价格的趋势,为投资决策提供参考。
  • 字符串匹配和搜索:最长递增子序列算法可以用于字符串匹配和搜索,例如在DNA序列中寻找最长递增子序列,用于基因分析。
  • 图像处理和识别:通过分析图像中像素点的最长递增子序列,可以提取出图像的边缘和轮廓,用于图像处理和识别。

7. 最长递增子序列算法的拓展应用案例

案例1:最长递增子序列的和最大化

给定一个序列,找到其最长递增子序列,并计算该子序列的元素和。

public class MaxSumOfLIS {public static int maxSumOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];int[] sum = new int[n];Arrays.fill(dp, 1);System.arraycopy(nums, 0, sum, 0, n);for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {if (dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;sum[i] = sum[j] + nums[i];} else if (dp[j] + 1 == dp[i]) {sum[i] = Math.max(sum[i], sum[j] + nums[i]);}}}}int maxSum = 0;int maxLength = 0;for (int i = 0; i < n; i++) {if (dp[i] > maxLength) {maxLength = dp[i];maxSum = sum[i];} else if (dp[i] == maxLength) {maxSum = Math.max(maxSum, sum[i]);}}return maxSum;}public static void main(String[] args) {int[] nums = {1, 101, 2, 3, 100, 4, 5};int maxSum = maxSumOfLIS(nums);System.out.println("Max Sum of Longest Increasing Subsequence: " + maxSum);}
}

案例2:最长递增子序列的个数统计

给定一个序列,找到其最长递增子序列,并统计该子序列的个数。

public class CountOfLIS {public static int countOfLIS(int[] nums) {int n = nums.length;int[] dp = new int[n];int[] count = new int[n];Arrays.fill(dp, 1);Arrays.fill(count, 1);for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j]) {if (dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;count[i] = count[j];} else if (dp[j] + 1 == dp[i]) {count[i] += count[j];}}}}int maxLength = 0;int maxCount = 0;for (int i = 0; i < n; i++) {if (dp[i] > maxLength) {maxLength = dp[i];maxCount = count[i];} else if (dp[i] == maxLength) {maxCount += count[i];}}return maxCount;}public static void main(String[] args) {int[] nums = {1, 3, 5, 4, 7};int count = countOfLIS(nums);System.out.println("Count of Longest Increasing Subsequence: " + count);}
}

8. 最长递增子序列算法的时间复杂度和空间复杂度

最长递增子序列算法的时间复杂度为O(n^2),其中n是序列的长度。算法的空间复杂度为O(n),用于存储dp数组。在实际应用中,可以通过使用二分查找优化算法的时间复杂度,将时间复杂度降低到O(nlogn)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6——知识点记录

这里写目录标题 1.字符串支持1.codePointAt——根据字符串码元的位置得到其码点2.includes——判断字符串中是否包含指定的子字符串3.startsWith——判断字符串中是否以指定的字符串开始4.endsWith——判断字符串中是否以指定的字符串结尾5.repeat——将字符串重复指定的次数&a…

Git commit 通用提交消息规范

在使用Git进行版本控制时&#xff0c;可以采用一种通用的提交消息规范&#xff0c;以提高团队协作和代码审查的效率。一种常见的提交消息规范是使用 “Conventional Commits” 规范&#xff0c;它使用一些预定义的关键字来标识提交的类型和目的。以下是一些常见的关键字和它们的…

JDBC 学习笔记(基础)

示意图 目录 创建 JDBC 应用 例子&#xff1a;通过本地协议纯 Java 驱动程序实现JDBC 代码具体步骤&#xff1a; 1.注册驱动 2.建立与数据库的连接 3.获取执行SQL语句的对象 Statement 4.定义执行 SQL 语句 5.操作结果集对象 ResultSet 6.关闭操作对象及连接对象 JD…

【Tricks】关于如何防止edge浏览器偷取chrome浏览器的账号

《关于如何防止edge浏览器偷取chrome浏览器的账号》 前段时间edge自动更新了&#xff0c;我并没有太在意界面的问题。但是由于我使用同一个网站平台时&#xff0c;例如b站&#xff0c;甚至是邮箱&#xff0c;edge的账号和chrome的账号会自动同步&#xff0c;这就导致我很难短时…

音视频 SDL vs2017配置

一、首先我把SDL放在了C盘根目录下 二、新建空项目 三、添加main.cpp //main.cpp #include<iostream> #include <SDL.h>int main(int argc, char* argv[]) // main函数头必须这样写&#xff0c;因为SDL把main定义成了宏 {SDL_Delay(3000); // 让窗口在屏幕上保持…

CSS 实现祥云纹理背景

&#x1fab4; 背景 最近掘金出来一个中秋创意活动&#xff0c;我准备参加一下。作品方向选择用纯css做一个中秋贺卡&#xff0c;其中有一些中秋的元素和一些简单的动画&#xff0c;而贺卡背景的实现就是本文要讲的内容。 中秋贺卡成果图&#xff08;生成gif有点失真&#x1f6…

聊聊交互设计师的成长 优漫动游

1.交互设计师应当具备的能力 聊聊交互设计师的成长 如果我们简单的将用户体验领域涉及到的技能分为&#xff1a;用户研究、产品&#xff08;概念/功能&#xff09;设计、交互设计、视觉设计、工程技术&#xff0c;我认为任何一个交互设计师和视觉设计师等等&#xff0c;都…

亚马逊鲲鹏系统日程控制功能可自动管理你的买家号

亚马逊鲲鹏系统是一款针对亚马逊买家号功能比较齐全的软件&#xff0c;可以批量注册、智能养号、自动下单、自动留评、QA等&#xff0c;这一系列功能都可以用日程控制进行管理操作。日程控制管理可以让你在吃饭睡觉、逛街玩耍时自动管理你的买家账号。 日程管理功能可以设置每月…

数据结构——二叉搜索树

二叉搜索树是二叉树的一种特殊形式。 二叉搜索树具有以下性质&#xff1a; 1.每个节点中的值必须大于&#xff08;或等于&#xff09;其左侧子树中的任何值 2.每个节点中的值必须小于&#xff08;或等于&#xff09;其右侧子树中的任何值。 像普通的二叉树一样&#xff0c;我们…

分享美好瞬间,内网穿透工具助您实现公网访问本地私人图床

文章目录 1. 树洞外链网站搭建1.1 下载安装树洞外链1.2 树洞外链网页测试1.3 cpolar的安装和注册 2.本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试 社交平台具有庞…

《Playing repeated games with Large Language Models》全文翻译

《Playing repeated games with Large Language Models》- 使用大型语言模型玩重复游戏 论文信息摘要1. 介绍2. 相关工作3. 一般方法4. 分析不同游戏系列的行为5. 囚徒困境5.1 性别之战 6. 讨论 论文信息 题目&#xff1a;《Playing repeated games with Large Language Model…

js中运算规则

法&#xff1a; 有对象&#xff0c;对象是根据object.valueof().toString()返回的值 //toString的对象 var obj2 {toString:function(){return a} } console.log(2obj2) //输出结果2a//常规对象 var obj1 {a:1,b:2 } console.log(2obj1)&#xff1b; //输出结果 2[object…

API数据接口在电子商务中的应用

一、引言 随着互联网和移动设备的普及&#xff0c;电子商务&#xff08;电商&#xff09;已经成为人们日常生活中不可或缺的一部分。无论是购买日常生活用品&#xff0c;还是享受便捷的服务&#xff0c;电商都扮演着重要的角色。而在这个快速发展的领域中&#xff0c;API&…

uniapp h5 echarts 打包后图表点击失效/及其他失效

文章目录 期望效果实际效果环境引入echarts方式解决方法&#xff1a;注意 原因多说一句在h5打包的时候将 history 改为 hash 不然在浏览器打开后刷新会404 期望效果 实际效果 环境 pc端 window11 hbuilderx版本 3.8.12 echarts版本 5.4.3 引入echarts方式 npm install echar…

华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

阿里云无影云桌面APP客户端下载(无影云电脑)

阿里云无影云电脑APP下载链接入口&#xff0c;支持iOS、Android、Windows、macOS和Web客户端&#xff0c;阿里云百科分享阿里云无影云电脑APP下载链接&#xff1a; 目录 阿里云无影云电脑APP下载链接入口 Windows客户端 macOS客户端 Web网页客户端 iOS客户端 Android客户…

自动驾驶之高精地图介绍

高精地图 文章目录 高精地图前言什么是高精地图高精数据分发引擎1.3 名词解释1. ADAS(Advanced DriverAssistance System)2. 为什么需要高精数据的分发引擎 高精数据分发引擎的建设高精数据分发引擎与ADAS应用的关系高精数据分发引擎架构高精数据分发引擎的模型表达路网模型的抽…

详解API接口如何安全的传输数据

概述 API接口的安全传输是确保数据在API请求和响应之间的传输过程中不被截获、篡改或泄露的重要步骤。以下是一些用于增强API接口安全传输的常见技术和最佳实践&#xff1a; 使用HTTPS&#xff1a;使用HTTPS协议而不是HTTP&#xff0c;以确保数据在传输过程中的安全性。HTTPS使…

软件系统的预算评估方法

软件系统的预算评估是确保项目能够在预定时间和成本范围内完成的重要步骤之一。以下是一些常见的软件系统预算评估方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.比较估算法&#xff1a; 这是…

Spring 框架中用到的设计模式。常见设计模式总结以及其作用简要说明

Spring 框架中使用了许多设计模式&#xff0c;以下列举⼀些⽐较重要的&#xff1a; 重点 &#xff1a;单例、代理、⼯⼚、责任链 1、单例模式&#xff1a; Spring 的 Bean 默认是单例模式&#xff0c;通过 Spring 容器管理 Bean 的⽣命周期&#xff0c;保证每个 Bean 只被创…