`
xitonga
  • 浏览: 586005 次
文章分类
社区版块
存档分类
最新评论

DP35 最长等差数列 Longest Arithmetic Progression @geeksforgeeks

 
阅读更多

在一个有序数组里找等差数列,用3个指针,以中间指针为基准,移动前后指针。


Given a set of numbers, find theLength of theLongestArithmeticProgression (LLAP) in it.

Examples:

set[] = {1, 7, 10, 15, 27, 29}
output = 3
The longest arithmetic progression is {1, 15, 29}

set[] = {5, 10, 15, 20, 25, 30}
output = 6
The whole set is in AP

For simplicity, we have assumed that the given set is sorted. We can always add a pre-processing step to first sort the set and then apply the below algorithms.

Asimple solutionis to one by one consider every pair as first two elements of AP and check for the remaining elements in sorted set. To consider all pairs as first two elements, we need to run a O(n^2) nested loop. Inside the nested loops, we need a third loop which linearly looks for the more elements inArithmeticProgression (AP). This process takes O(n3) time.

We can solve this problem in O(n2) timeusing Dynamic Programming. To get idea of the DP solution, let us first discuss solution of following simpler problem.

Given a sorted set, find if there exist three elements in Arithmetic Progression or not
Please note that, the answer is true if there are 3 or more elements in AP, otherwise false.
To find the three elements, we first fix an element as middle element and search for other two (one smaller and one greater). We start from the second element and fix every element as middle element. For an element set[j] to be middle of AP, there must exist elements ‘set[i]‘ and ‘set[k]‘ such that set[i] + set[k] = 2*set[j] where 0 <= i < j and j < k <=n-1.
How to efficiently find i and k for a given j?We can find i and k in linear time using following simple algorithm.
1)Initialize i as j-1 and k as j+1
2)Do following while i >= 0 and j <= n-1
..........a)If set[i] + set[k] is equal to 2*set[j], then we are done.
……..b)If set[i] + set[k] > 2*set[j], then decrement i (do i–-).
……..c)Else if set[i] + set[k] < 2*set[j], then increment k (do k++).


How to extend the above solution for the original problem?
The above function returns a boolean value. The required output of original problem isLength of theLongestArithmeticProgression (LLAP) which is an integer value. If the given set has two or more elements, then the value of LLAP is at least 2 (Why?).
The idea is to create a 2D table L[n][n]. An entry L[i][j] in this table stores LLAP with set[i] and set[j] as first two elements of AP and j > i. The last column of the table is always 2 (Why - see the meaning of L[i][j]). Rest of the table is filled from bottom right to top left. To fill rest of the table, j (second element in AP) is first fixed. i and k are searched for a fixed j. If i and k are found such that i, j, k form an AP, then the value of L[i][j] is set as L[j][k] + 1. Note that the value of L[j][k] must have been filled before as the loop traverses from right to left columns.


package DP;

public class LongestArithmeticProgression {

	public static void main(String[] args) {
		int[] A = {1, 7, 10, 15, 27, 29};
		System.out.println(arithmeticThree(A, A.length));
		System.out.println(lengthOfLongestAP(A, A.length));
		int[] B = {1, 7, 10, 15, 27, 28};
		System.out.println(arithmeticThree(B, B.length));
		System.out.println(lengthOfLongestAP(B, B.length));
	}
	
	// 判断是否有等差数列的存在
	public static boolean arithmeticThree(int[] A, int n){
		for(int j=1; j<n-1; j++){		// j为等差数列中间那个数
			int i=j-1, k=j+1;
			while(i>=0 && k<=n-1){
				if(A[i]+A[k] == 2*A[j]){	// 找到
					return true;
				}else if(A[i]+A[k] > 2*A[j]){	// 过大
					i--;
				}else{	// 过小
					k++;
				}
			}
		}
		return false;
	}
	
	// Returns length of the longest AP subset in a given set
	// O(n^2) time, space
	public static int lengthOfLongestAP(int[] A, int n){
		if(n <= 2){
			return n;
		}
		
		// Create a table and initialize all values as 2. The value of
	    // L[i][j] stores LLAP with A[i] and A[j] as first two
	    // elements of AP. Only valid entries are the entries where j>i
		int[][] L = new int[n][n];		// L[i][j]: 以A[i]和A[j]为前两项的最长等差数列项数
		int llap = 2;		// 最长等差数列项数
		
		// Fill entries in last column as 2. There will always be
	    // two elements in AP with last number of set as second
	    // element in AP
		for(int i=0; i<n; i++){
			L[i][n-1] = 2;
		}
		
		// Consider every element as second element of AP
		for(int j=n-2; j>=1; j--){
			int i=j-1, k=j+1;		// Search for i and k for j
			while(i>=0 && k<=n-1){
				if(A[i]+A[k] < 2*A[j]){
					k++;
				}else if(A[i]+A[k] > 2*A[j]){	// Before changing i, set L[i][j] as 2
					L[i][j] = 2;		// 初始化,项数至少为2
					i--;
				}else{
				    // Found i and k for j, LLAP with i and j as first two
    	            // elements is equal to LLAP with j and k as first two
	                // elements plus 1. L[j][k] must have been filled
	                // before as we run the loop from right side
					L[i][j] = L[j][k] + 1;  // 因为包括了[i,j]和[j,k]两项,比原来的[j,k]多了一项
					
					// Update overall LLAP, if needed
					llap = Math.max(llap, L[i][j]);
					
					// Change i and k to fill more L[i][j] values for current j
					i--;
					k++;
				}
			}
			
			// If the loop was stopped due to k becoming more than
	        // n-1, set the remaining entities in column j as 2
			while(i >= 0){
				L[i][j] = 2;
				i--;
			}
		}
		
		return llap;
	}

}


http://www.geeksforgeeks.org/length-of-the-longest-arithmatic-progression-in-a-sorted-array/

分享到:
评论

相关推荐

    各主板黑苹果DSDT补丁

    DSDT补丁包含以下主板型号: 4Core1600 DVI.txt 45CMV-K.txt 745B.txt 945G7MD.txt 945GCT M.txt 945GCT M3.txt 945P Neo3.txt 1000H.txt 1414.txt 12153.txt 15008.txt A42F.txt A510 U.txt ...N6000W...

    C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码

    C#,数值计算,解微分方程的龙格-库塔二阶方法与源代码 微分方程 含有导数或微分的方程称为微分方程,未知函数为一元函数的微分方程称为常微分方程。 微分方程的阶数 微分方程中导数或微分的最高阶数称为微分方程的阶数。 微分方程的解 使得微分方程成立的函数称为微分方程的解。 微分方程的特解 微分方程的不含任意常数的解称为微分方程的特解。 微分方程的通解 所含相互独立的任意常数的个数与微分方程的阶数相等的微分方程的解称为微分方程的通解。

    桌面聊天室

    该毕业设计采用了c/s架构,通过javase中的知识编写完成,系统功能包括:用户注册,用户登录,聊天功能。 对于刚学完java基础的同学来说可以通过该毕业设计加深对所学知识的理解。该系统使用socket进行数据的发送,用户注册登录之后,可以进行多人聊天,功能类似qq群聊。

    【前端素材】大数据-交通大屏.zip

    大数据技术指的是用于处理和分析大规模数据集的技术和工具。以下是一些常见的大数据技术和工具: Hadoop:Apache Hadoop是一个用于分布式存储和处理大规模数据的开源框架。它包括Hadoop Distributed File System(HDFS)用于数据存储和MapReduce用于数据处理。 Spark:Apache Spark是一个快速、通用的集群计算系统,提供了比MapReduce更快的数据处理能力。它支持内存计算和更多复杂的数据处理流程。 NoSQL数据库:NoSQL数据库(如MongoDB、Cassandra等)则更适用于处理这类数据。 数据仓库:数据仓库是一个用于集成和分析大规模数据的存储系统,一些知名的数据仓库包括Snowflake、Amazon Redshift等。 数据湖:数据湖是一个存储结构化和非结构化数据的存储池,用于支持数据分析和机器学习应用。 机器学习:大数据技术也广泛应用于机器学习领域,支持大规模数据的模型训练和预测分析。 流式处理:针对实时数据处理需求,流式处理技术(如Apache Kafka、Apache Flink)可以实时。

    inspect:windows系统下的控件识别工具

    windows系统下的控件识别工具,可用于桌面应用的UI自动化测试

    038ssm-jsp-mysql高校毕业生就业满意度调查统计系统.zip(可运行源码+数据库文件+文档)

    高校毕业生就业满意度调查统计系统是以实际运用为开发背景,运用软件工程开发方法,采用jsp技术构建的一个管理系统。整个开发过程首先对软件系统进行需求分析,得出系统的主要功能。接着对系统进行总体设计和详细设计。总体设计主要包括系统总体结构设计、系统数据结构设计、系统功能设计和系统安全设计等;详细设计主要包括模块实现的关键代码,系统数据库访问和主要功能模块的具体实现等。最后对系统进行功能测试,并对测试结果进行分析总结,及时改进系统中存在的不足,为以后的系统维护提供了方便,也为今后开发类似系统提供了借鉴和帮助。 本高校毕业生就业满意度调查统计系统采用的数据库是Mysql,使用JSP技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。 关键词:高校毕业生就业满意度调查统计系统,JSP技术,Mysql数据库

    小程序-58-童心党史小程序-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    ubuntu网络环境配置

    ubuntu网络环境配置

    php开源商城系统,基于swoole、easyswoole框架开发.zip

    php开源商城系统,基于swoole、easyswoole框架开发.zip

    node-v12.6.0-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    小程序-17-个人健康信息管理小程序-源码.zip

    提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    决策树.zip0002

    决策树, 决策树(Decision Tree)是一种常见的数据挖掘算法,它模仿人类决策过程来预测数据。决策树是一种树形结构,它从根节点开始,分支延伸至叶节点,每个内部节点代表了某个特征的测试,而每个叶节点代表了最终的预测结果。

    node-v12.18.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v13.0.1-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    【课件PPT】华为干部赋能手册gl.pptx

    【课件PPT】华为干部赋能手册gl.pptx

    Spring Initializr(官方修改版)

    该版本基于Spring官网 start.spring.io 进行修改 拦截:https://api.spring.io/projects/spring-boot/releases 并已文件形式缓存到本地 再次请求时从本地文件获取 Spring Metadata,改善对spring.io访问。 重写部分: @Override protected List<DefaultMetadataElement> fetchSpringBootVersions(String url)

    基于java的-42-16-企业员工信息管理系统-源码.zip

    提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

    扩散概率模型论文学习笔记(非常详细)

    扩散概率模型论文学习笔记(非常详细)

    node-v16.13.2-darwin-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    线性规划问题及灵敏度分析在LINGO软件中的实现.doc

    数学模型算法

Global site tag (gtag.js) - Google Analytics