K:找寻最长子序列的四个算法

最长递增子序列(LIS)的三种算法 最长递增子序列:给定一个长度为N的数组,找出一个最长的单调递增子序列,子序列不一定连续,但初始顺序不能乱。 比如数组A={1,3,4,2,5},其最长递增子序列为1,3,4,5 方法一:最长公共子序列法 对于给定长度为N的数组A: 使数组B为排序后的数组A (O(NlogN)) 求出A与B的最长公共子序列(LCS) (O(N2)) 对求得的公共子序列进行去重 (O(N)... 阅读详情
package other;
/**
 * 该类用于演示寻找最长子序列的几种算法
 * @author 学徒
 *
 */
public class MaxSubLined
{
	public static void main(String[] args)
	{
		int[] array={-2,11,-4,13,-5,2,-5,-3,12,-9};
		MaxSubLined max=new MaxSubLined();
		System.out.println(max.maxSubN3(array));
		System.out.println(max.maxSubN2(array));
		System.out.println(max.maxSubNlogN(array));
		System.out.println(max.maxSubN(array));
	}
	/**
	 * 用于演示O(N^3)的算法
	 * 算法的思路:
	 * 穷举数组中以某个元素为起始的,数组中以该元素为起始元素的所有子序列的可能
	 * 并找出其中子序列和最大的那个值
	 * @param array 用于寻找最长子序列的数组
	 * @return 最长子序列的值
	 */
	public int maxSubN3(int[] array)
	{
		int result=0;
		int length=array.length;
		//用于控制子序列的起始下标
		for(int i=0;i<length;i++)
		{
			//用于控制子序列的终止下标
			for(int j=i;j<length;j++)
			{
				//用于计算起始下标到终止下标之间的元素的和
				int sum=0;
				for(int k=i;k<=j;k++)
				{
					sum+=array[k];
				}
				result=Math.max(sum, result);
			}
		}
		return result;
	}
	/**
	 * 用于演示O(N^2)的算法
	 * 算法的思路:
	 * 穷举数组中以某个元素为起始的,数组中以该元素为起始元素的所有子序列的可能
	 * 并找出其中子序列和最大的那个值
	 * @param array 用于寻找最长子序列的数组
	 * @return 最长子序列的值
	 */
	public int maxSubN2(int[] array)
	{
		int length=array.length;
		int result=0;
		for(int i=0;i<length;i++)
		{
			int sum=0;
			for(int j=i;j<length;j++)
			{
				sum+=array[j];
				result=Math.max(result, sum);
			}
		}
		return result;
	}
	/**
	 * 用于演示O(NlogN)的算法
	 * 算法的思路:
	 * 采用分治的思想,将数组划分为两半,最长子序列出现的可能只有三种
	 * 要么在数组的左半边,要么在数组的右半边,要么横跨了数组的左右半边,同时其必定包含
	 * 数组左半边的右边界以及数组右半边的左边界
	 * @param array 用于寻找最长子序列的数组
	 * @return
	 */
	public int maxSubNlogN(int[] array)
	{
		return maxSubNlogN(array,0,array.length-1);
	}
	/**
	 * 用于递归的那个方法,low和high为数组的左右边界
	 */
	private int maxSubNlogN(int[] array,int low,int high)
	{
		//当只剩下一个数组元素的时候,将其直接进行返回
		if(low==high)
			return Math.max(array[low], 0);
		//找到数组中间的分界点
		int mid=low+(high-low)/2;
		//用于寻找到横跨数组左右半边的那个最长子序列
		int lMax=0,rMax=0;
		int lSum=0,rSum=0;
		//找到包含右边界的左半边的最长子序列
		for(int i=mid;i>=low;i--)
		{
			lSum+=array[i];
			lMax=Math.max(lSum, lMax);
		}		
		//找到包含左边界的右半边的最长子序列
		for(int i=mid+1;i<high;i++)
		{
			rSum+=array[i];
			rMax=Math.max(rSum, rMax);
		}
		//返回三种情况中子序列和最大的那个值
		return Math.max(maxSubNlogN(array,mid+1,high),Math.max(rMax+lMax, maxSubNlogN(array,low,mid)));
	}
	/**
	 * 用于演示O(N)的算法
	 * 算法的思路:
	 * 因为最长子序列中的任意一个子序列里的元素值总和均为正数
	 * 为此,可以在遍历数组的过程中,计算出其最长子序列
	 * @param array 用于寻找最长子序列的数组
	 * @return 最长子序列的值
	 */
	public int maxSubN(int[] array)
	{
		int sum=0;
		int result=0;
		for(int i=0;i<array.length;i++)
		{
			sum+=array[i];
			if(sum>result)
				result=sum;
			if(sum<0)
				sum=0; 
		}
		return result;
	}
}


最长子序列 1. 最长递增子序列(注意不连续) 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 1)动态规划 dp[i]--------到i为止包括i递增子序列的长度,最后一位必须包括nums[i] dp[i]=Math.max(dp[0],dp[1],....,dp[i-1])+1; if(nums[i]>nums[j]) dp 阅读详情

相关推荐

算法研习:无重复字符的最长子串问题剖析

通过对“无重复字符的最长子串”问题的暴力解法和滑动窗口优化解法的详细讲解与代码实现,我们清晰地看到了算法优化的重要性和有效性。滑动窗口解法在时间复杂度上相比暴力解法有了巨大提升,更适用于实际应用场景。在算法学习和面试准备过程中,遇到字符串相关问题时,我们可以借鉴这种思路,尝试寻找更高效的解决方案。希望这篇博客能为大家在算法学习的道路上提供有益的参考,助力大家不断提升算法能力,攻克更多的算法难题。

ly1379223878的博客 1138

求所有最大公共子序列的算法实现

最近看了很多关于LCS(Longestcommonsubsequenceproblem,最长公共子序列)的文章,大部分问题都只是求出最大公共子序列的长度,或者打印处其中的任意一个最大子序列即可,但是如何快速的打印出所有的最大长度子序列?这个问题好像看到的不多。本文给出了传统的DP(dynamicprogramming,动态规划)算法进行求解的过程,并用c语言实现。另外参考一篇论文实现了其中...

weixin_30654419的博客 400

340. 至多包含 K 个不同字符的最长子串

这是一个典型的滑动窗口问题,通过维护一个窗口来寻找满足条件的最长子串。题号.题目名称:340. 至多包含 K 个不同字符的最长子串。个不同字符的最长子串。

qq_40844444的博客 870

动态规划经典问题:寻找最长公共子序列

该问题为动态规划的经典问题。输入两个字符串,如cnblogs和belong,则最长公共子序列为blog。          设序列X=和Y=的一个最长公共子序列Z=,则:        1. 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;        2. 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;        3.

hohojiang的专栏 680

避坑指南:Cursor AI生成Flutter代码时最容易翻车的5个配置细节

本文深入剖析了使用Cursor AI生成Flutter代码时,因.cursorrules配置文件不当而导致的五大常见问题。重点探讨了如何通过制定清晰、具体的规则,避免状态管理混乱、设计图输入低效、项目架构脱节、性能隐患及规则维护缺失等陷阱,从而将AI转化为高效、可靠的开发伙伴,提升代码质量和团队协作效率。

wdx0123456的博客 415

从MRF8P9040N数据手册到ADS仿真:手把手教你搞定LDMOS功放设计(附完整模型下载)

本文详细解析了MRF8P9040N LDMOS功率放大器的数据手册关键参数,并提供了在ADS中进行仿真的完整指南。从模型导入、直流工作点验证到负载牵引与阻抗匹配设计,逐步指导工程师完成高效功放设计。文章还包含调试技巧和常见问题解决方案,帮助优化射频功放性能。

weixin_27015733的博客 491

三种方法求最长子序列问题

#include #include using namespace std; int maxsum(int a[],int x,int y) { int v,l,r; if(y-x==1)//只有一个元素,直接返回 return a[x]; int m=x+(y-x)/2;//分治法第一步,划分成[x,m)和[m,y) int maxs=max(maxsum(a,x,m),maxsu

dreamzuora的博客 842

ADS8681数据手册没讲透的细节:SPI时序、量程切换与电压换算的避坑指南

本文深入解析ADS8681数据手册未提及的SPI时序优化、量程切换陷阱与电压校准技巧。针对树莓派5与ADS8681的SPI通信问题,提供CPOL/CPHA配置建议;详解量程切换的位操作玄机与寄存器配置流程;并提出三步校准法应对非理想供电环境,帮助开发者提升ADC测量精度。

weixin_29178069的博客 522

最长递增子序列

问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解法1:最长公共子序列法 这个问题可以转换为最长公共子序列问题。如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1, 2, 5, 6, 7,...

切梦 5419

folium离线地图实战:从下载到部署的完整指南

本文提供了一份完整的folium离线地图实战指南。针对网络不稳定或内网环境下的地图应用需求,详细讲解了如何下载离线地图瓦片数据,并通过两种核心方法(直接替换URL与创建TileLayer)将其集成到folium中。文章还涵盖了部署优化、边界处理及资源本地化等关键步骤,帮助你构建完全脱离网络依赖的交互式地图应用。

weixin_29061041的博客 276

SAP 公司间库存调拨通过IDOC完成自动发票校验

本文仅用于SAP软件的应用与学习,不代表SAP公司。(注:文中所示截图来源SAP ERP软件,软件相应著作权归SAP所有。公司间采购时,通过SAP内部EDI 数据传输功能, 由销售方开的公司间发票自动触发采购方的发票校验。​欢迎扫码加如下微信,我会把大家拉到SAP PP学习群,随时欢迎跟我和其他SAP PP顾问一起交流和学习,如下图库存调拨订单,系统已经完成了发货方发货和收货方收货。

2402_84262664的博客 926

【贪心】【回溯】【字符串】2014. 重复 K 次的最长子序列|2558

给你一个长度为 n 的字符串 s ,和一个整数 k 。请你找出字符串 s 中 重复 k 次的 最长子序列 。 子序列 是由其他字符串删除某些(或不删除)字符派生而来的一个字符串。 如果 seq * k 是 s 的一个子序列,其中 seq * k 表示一个由 seq 串联 k 次构造的字符串,那么就称 seq 是字符串 s 中一个 重复 k 次 的子序列。 举个例子,"bba" 是字符串 "bababcba" 中的一个重复 2 次的子序列,因为字符串 "bbabba" 是由 "bba" 串联 2 次构造的,而

闻缺陷则喜何志丹 1070

OpenClaw对接本地大模型:Llama3/Qwen/ChatGLM全适配,完全私有化部署

OpenClaw对接本地大模型,是企业级AI智能体落地的必经之路——它不仅解决了数据隐私和合规问题,还能大幅降低成本、提升响应速度、实现定制化。这篇文章我给大家完整拆解了两套部署方案:Ollama(新手首选,5分钟搞定)和vLLM(生产环境首选,高性能),覆盖了Llama3/Qwen/ChatGLM三大主流模型,还有真实的落地案例、高级优化、踩坑避坑指南,看完你就能零代码完成完全私有化的部署。从零开发自定义工具,给OpenClaw添加专属业务能力;

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 809

数组:最长子序列问题四种解法

数组:最长子序列问题四种解法 问题描述:   给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 1 : 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 解法一、三重for循环 解题思路: 通过前两层for循环找出数组的所有组合,第三层for循环计算该组合的sum,如果大于max,则赋值给max。   时间复杂度是O(N3),空间复杂度是O(1)。 public

Milan_1in的博客 3846

Python的单元测试之unittest

是一个功能类似 unittest 的库,它集合众家标准测试库之所长,和 unittest 相比,功能更为强大,使用更为简单,OpenStack 广泛的利用它编写单元测试。unittest 提供了自动匹配发现并执行测试用例的功能,随着项目代码结构越发庞大,势必有多个测试文件,自动匹配发现并测试用例的功能在此就显得非常有用,只要满足。unittest 提供了丰富的命令行入口,可以根据需要执行某些特定的用例。的测试用例都会被 unittest 发现并执行,测试用例文件的默认匹配规则为 test*.py。

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 283

手把手教你学PCIE(11.3)--pcie的认证和合规性测试

PCIe 设备的认证和合规性测试是确保设备正常工作和达到预期性能的关键步骤。通过使用 PCI-SIG 提供的测试工具和第三方测试工具,可以全面评估 PCIe 设备的物理层、链路层、事务层和互操作性,确保设备符合行业标准和规范。

MHD0815的博客 1360

最长子序列的长度

最长子序列问题(two ways) 复杂度为O(n^2) 朴素算法, 代码如下: #include&amp;amp;amp;amp;lt;cstdio&amp;amp;amp;amp;gt;//或者用bits万能库 using namespace std; const int MAX=1001; int a[MAX]; int lis(int x) { int num[MAX]; for(int i=0;i&amp;amp;

qq_34771124的博客 1115

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

滑动窗口算法详解:无重复字符的最长子串问题

本文详细讲解了使用滑动窗口算法解决"无重复字符的最长子串"问题。通过维护左右指针和字符位置数组,该算法能在O(n)时间复杂度内高效求解。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 7541

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【动态规划】最长子串问题汇总(四)最长公共上升子序列

在练习算法的过程中,发现各种子序列问题容易混淆,问题通常是连续,公共,上升(递增)三词随意组合,本系列就最长子串(子序列)问题进行归纳对比

weixin_57706322的博客 2172

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最长子串和的三种算法

1.实验目的: 比较同一问题,采用不同策略设计不同算法,分析和比较算法的性能。 2.实验内容: 自学第10章的10.1.1至10.1.3, 总结分析编程实现简单算法、分治法和动态规划算法的理论复杂度,编程实现这些算法。 3.实验要求: 并对一组数据测试实际运行时间,算法实际运行时间检测实际运行时间与理论分析是否一致。 □\square□ 基础性实验 □\square□ 综合性实验 ⊠\boxtimes⊠ 设计性实验 实验报告正文 一、问题分析(模型、算法设计和正确性证明等)

weixin_44609261的博客 2046

2014. 重复 K 次的最长子序列

2014. 重复 K 次的最长子序列 (暴力) 注意到n<k×8n<k \times 8n<k×8 也就说满足条件的字符数不超过nk<8\dfrac{n}{k}<8kn​<8。 然后我们可以暴力长度为1到7的字符,每次找长度为iii的字符时我们可以根据i−1i-1i−1的字符进行递推这样可以节省时间,然后枚举字符的时候我们只需要枚举哪些出现次数大于等于kkk的字符。 最后输出的时候从长度大到小,然后优先输出末尾的,因为我们暴力找的时候是按照字典序从小到大进行的。 时间复杂

Harris-H的博客 619

[leetcode]2014 重复K次的最长子序列

第259场周赛补题 2014. 重复 K 次的最长子序列 给你一个长度为 n 的字符串 s ,和一个整数 k 。请你找出字符串 s 中 重复 k 次的 最长子序列 。 子序列 是由其他字符串删除某些(或不删除)字符派生而来的一个字符串。 如果 seq * k 是 s 的一个子序列,其中 seq * k 表示一个由 seq 串联 k 次构造的字符串,那么就称 seq 是字符串 s 中一个 重复 k 次 的子序列。 举个例子,"bba" 是字符串 "bababcba" 中的一个重复 2 次的子序列,因为字符串

Chris_Eddy的博客 494

第433场周赛:变长子数组求和、最多 K 个元素的子序列的最值之和、粉刷房子 Ⅳ、最多 K 个元素的子数组的最值之和

第433场周赛:变长子数组求和、最多 K 个元素的子序列的最值之和、粉刷房子 Ⅳ、最多 K 个元素的子数组的最值之和

Lenyiin 1298

leetcode.2014 重复k次的最长子序列

leetcode 2014重复k次的最长子序列解题思路

xhhgffd的博客 3853

动态规划思路以及求最长子序列的算法

相关概念: 状态:子问题相关的各个变量的一组取值。 无后效性:子问题的解取值与解题路径无关。 动态规划: 解题步骤: 1.将原问题分解为子问题。 2.确定状态。 3.确定边界状态。 4.确定状态转移方程。 特点: 1.问题具有最优子结构 2.无后效性。 求最长子序列的算法问题描述: 解题思路: 1.将原问题分解为子问题,并且子问题满足无后效性。 以 a[i]为终点 对应的最长序列为子问题。 2.确定状态。 maxLen(a【i】),其中a【k】为小于a【i】的数 ...

weixin_43592833的博客 588

最长子串和为k的倍数的长度和最长子序列和为k的倍数的长度

暴力解法 + 优化 暴力解法就是双重循环。 - 优化点在于我们从最长开始判断可以尽早的结束。只要找到第一次整除,即可获取到结果。 所以外层循环为长度,内循环为该长度的起始点。 比如对于长度n,从索引1开始,此时就1个子串。 比如对于长度n - 1, 从索引1开始会有2个子串,是:[1, n - 1], [2, n]。 以此类推,直到外循环长度为0结束。 其上可以在第一次整除的情...

dawn_after_dark的博客 2264
上一篇: K:找寻数组中第n大的数组元素的值的三个算法
下一篇: K:java枚举的常见用法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值