`
duoduodeai
  • 浏览: 50908 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

求帮忙啊,如何写如下算法

    博客分类:
  • Java
 
阅读更多

请给出函数,实现如下功能

class Solution { public int maxRS(int[] A); }

给定一个0为起始下标的数组 A ,其中包含 N 个整数, 返回 A 中最长的连续递增子序列的起始下标, 如果不存在这样的子序列,则返回−1

例如,给定 N=10 并且

 

A[0] =  2  A[1] = 2  A[2] = 2
A[3] =  2  A[4] = 1  A[5] = 2
A[6] = -1  A[7] = 2  A[8] = 1
A[9] =  3  

 

此函数可以返回 4,因为 A 中最长的连续递增子序列的长度为 2, 同时从下标 4 开始的长度为 2 的子序列是一个连续递增子序列, 6 或者 8 同样也是正确的答案。

又例如:给定 N=3 的数组 A[0]=30, A[1]=20, A[2]=10, 此函数可以返回 0, 1, 2, 因为数组 A 的最长的连续递增子序列的长度为 1.

数组 A 中可能包含数百兆字节的数据。

假定:

  • N 是 [1..1,000,000] 内的 整数;
  • 数组 A 每个元素是取值范围 [−2,147,483,648..2,147,483,647] 内的 整数 .

复杂度:

  • 最坏-情况下,期望的时间复杂度是 O(N);
  • 最坏-情况下,期望的空间复杂度是 O(N), 输入存储除外 (不计输入参数所需的存储空间).

输入数组中的元素可以修改.

2
1
分享到:
评论
13 楼 lzxz1234 2013-03-08  
    public static int maxRS(int[] array) {
        
        if(array == null || array.length == 0) return -1;
        if(array.length == 1) return 0;
        
        int maxStart = 0;
        int maxLength = 1;
        
        int currentStart = 0;
        int currentLength = 1;
        for(int i = 1; i < array.length; i ++) {
            if(array[i] > array[i - 1]) {
                currentLength ++;
            } else {
                if(currentLength > maxLength) {
//                    System.out.println("最大长度更新到:" + currentLength);
                    maxLength = currentLength;
                    maxStart = currentStart;
                }
                currentLength = 1;
                currentStart = i;
            }
        }
        return maxStart;
    }

看看如何
12 楼 java_project 2013-03-08  
如果说刚才没考虑时间复杂度,那这样...
public class MasRS {

	private static int[] A = {2,2,2,2,1,2,3,-1,2,3,4,5};
	
	public static void main(String[] args) {
		int a = maxRS(A);
		System.out.println("begin index:"+a);
	}
	
	public static int maxRS(int[] A){
		int returnvalue = -1;//begin index
		int count = 0;//step length
		int i = 0;
		while(i<A.length){
			int j=i;
			int length = 0;
			while(compArray(A,j)){
				j++;
				length++;
			}
			if(length>count){
				count = length;
				returnvalue = i;
			}
			i = j+1;
		}
		return returnvalue;
	}
	
	public static boolean compArray(int []A,int index){
		if(index>=A.length-1){
			return false;
		}
		if(A[index]<A[index+1]){
			return true;
		}else{
			return false;
		}
	}
}
11 楼 duoduodeai 2013-03-08  
享受生活 写道
java_project 写道
public class MasRS {

	private static int[] A = {2,2,2,2,1,2,-1,2,1,3};
	
	public static void main(String[] args) {
		int a = maxRS(A);
		System.out.println("begin index:"+a);
	}
	
	public static int maxRS(int[] A){
		int returnvalue = -1;//begin index
		int count = 0;//step length
		for(int i=0;i<A.length;i++){
			int j=i;
			int length = 0;
			while(compArray(A,j)){
				j++;
				length++;
			}
			if(length>count){
				count = length;
				returnvalue = i;
			}
		}
		return returnvalue;
	}
	
	public static boolean compArray(int []A,int index){
		if(index>=A.length-1){
			return false;
		}
		if(A[index]<A[index+1]){
			return true;
		}else{
			return false;
		}
	}
}
代码格式有问题?


结果貌似正确,但时间复杂度大于O(N)


小弟万分感谢!
10 楼 享受生活 2013-03-08  
java_project 写道
public class MasRS {

	private static int[] A = {2,2,2,2,1,2,-1,2,1,3};
	
	public static void main(String[] args) {
		int a = maxRS(A);
		System.out.println("begin index:"+a);
	}
	
	public static int maxRS(int[] A){
		int returnvalue = -1;//begin index
		int count = 0;//step length
		for(int i=0;i<A.length;i++){
			int j=i;
			int length = 0;
			while(compArray(A,j)){
				j++;
				length++;
			}
			if(length>count){
				count = length;
				returnvalue = i;
			}
		}
		return returnvalue;
	}
	
	public static boolean compArray(int []A,int index){
		if(index>=A.length-1){
			return false;
		}
		if(A[index]<A[index+1]){
			return true;
		}else{
			return false;
		}
	}
}
代码格式有问题?


结果貌似正确,但时间复杂度大于O(N)
9 楼 享受生活 2013-03-08  
brucewei777 写道
1.到底返回值是一个还是一个列表?
2.当递增子序列的长度为1时,还有返回的必要吗?

其实给定int[] A后,可以得到两两元素之间的差的列表
例如:
A[0] =  2  A[1] = 2  A[2] = 2
A[3] =  2  A[4] = 1  A[5] = 2
A[6] = -1  A[7] = 2  A[8] = 1
A[9] =  3 

可以得到
0,0,0,-1,1,-3,3,-1,2

然后找到你要的子序列应该就比较容易了,如果我没理解错的话


你这样做没意义。
8 楼 享受生活 2013-03-08  
哥写出来了。
7 楼 cdcx 2013-03-08  
最大的数组个数1,000,000, 每个int占用4byte,总共的内存开销是400M。所以数据全部放在内存中是没有问题。只需要一次遍历就可以找出结果。时间复杂是O(n)
6 楼 cdcx 2013-03-08  
public class RSFinder {

    static int maxRS(int data[]) {
        int maxIndex = 0;
        int maxCounter = 0;
        int rsBeginIndex = 0;
        int rsCounter = 0;
        boolean isRsBegin = false;
        for (int i = 0; i < data.length; i++) {
            if (((i + 1) < data.length) && data[i + 1] > data[i]) {
                if (!isRsBegin) {
                    rsBeginIndex = i;
                    isRsBegin = true;
                }
                rsCounter++;
            } else {
                if (rsCounter > maxCounter) {
                    maxIndex = rsBeginIndex;
                    maxCounter = rsCounter;
                }
                isRsBegin = false;
                rsCounter = 0;
            }
        }
        return maxIndex;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int data[] = { 2, 2, 2, 2, 1, 2, -1, 2, 1, 3 };
        // int data[] = {2, 3, 4, 2, 3,4,5};
        // int data[] = { 2 };
        System.out.println(" " + maxRS(data));
    }

}


5 楼 java_project 2013-03-08  
public class MasRS {

	private static int[] A = {2,2,2,2,1,2,-1,2,1,3};
	
	public static void main(String[] args) {
		int a = maxRS(A);
		System.out.println("begin index:"+a);
	}
	
	public static int maxRS(int[] A){
		int returnvalue = -1;//begin index
		int count = 0;//step length
		for(int i=0;i<A.length;i++){
			int j=i;
			int length = 0;
			while(compArray(A,j)){
				j++;
				length++;
			}
			if(length>count){
				count = length;
				returnvalue = i;
			}
		}
		return returnvalue;
	}
	
	public static boolean compArray(int []A,int index){
		if(index>=A.length-1){
			return false;
		}
		if(A[index]<A[index+1]){
			return true;
		}else{
			return false;
		}
	}
}
代码格式有问题?
4 楼 java_project 2013-03-08  
public class MasRS {

private static int[] A = {2,2,2,2,1,2,-1,2,1,3};

public static void main(String[] args) {
int a = maxRS(A);
System.out.println("begin index:"+a);
}

public static int maxRS(int[] A){
int returnvalue = -1;//begin index
int count = 0;//step length
for(int i=0;i<A.length;i++){
int j=i;
int length = 0;
while(compArray(A,j)){
j++;
length++;
}
if(length>count){
count = length;
returnvalue = i;
}
}
return returnvalue;
}

public static boolean compArray(int []A,int index){
if(index>=A.length-1){
return false;
}
if(A[index]<A[index+1]){
return true;
}else{
return false;
}
}
}

我写个简单的例子,这个不考虑数组的大小问题。如果数组很大的情况,我理解可以分段处理,比如分10或者100段,然后在每组去找开始值,然后只需要记录上个数组值的开始点,以及是否是最近的一次比对,比如说{2,1,3}这样记录开始坐标1,步长1,状态true(是否连续下个数组),如果{2,3,2}则记录0,步长1,状态false这样就不去关联下个分段数组就OK了吧。
3 楼 brucewei777 2013-03-08  
1.到底返回值是一个还是一个列表?
2.当递增子序列的长度为1时,还有返回的必要吗?

其实给定int[] A后,可以得到两两元素之间的差的列表
例如:
A[0] =  2  A[1] = 2  A[2] = 2
A[3] =  2  A[4] = 1  A[5] = 2
A[6] = -1  A[7] = 2  A[8] = 1
A[9] =  3 

可以得到
0,0,0,-1,1,-3,3,-1,2

然后找到你要的子序列应该就比较容易了,如果我没理解错的话
2 楼 cheneyjuu 2013-03-08  
递归          
1 楼 gao_xianglong 2013-03-08  
在下愚昧,没看懂你到底想这什么算法

相关推荐

    基于servlet+jsp+mysql实现的影视管理系统课程设计

    【作品名称】:基于servlet+jsp+mysql实现的影视管理系统【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 基于servlet+jsp+mysql实现的影视管理系统【课程设计】 Java Web课程设计,基于servlet+jsp+ajax+mysql做的影视管理系统 运行环境: Tomcat 9.0 JDK 1.8 MySQL 8.0 后台管理账号密码均为:root,项目依赖:lib 目录 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    kernel-5.15-ky10-x86.tar.gz

    kernel-5.15-ky10-x86.tar.gz

    基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】

    【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    基于java的法律咨询系统设计与实现.docx

    基于java的法律咨询系统设计与实现.docx

    适用于元营销 API 的 Python SDK.zip

    适用于元营销 API 的 Python SDK适用于 Python 的 Facebook Business SDK 介绍Facebook Business SDK是一站式服务,可帮助我们的合作伙伴更好地服务于他们的业务。合作伙伴正在使用多个 Facebook API 来满足其客户的需求。采用所有这些 API 并在各个平台上保持最新状态可能非常耗时,而且最终会造成高昂的成本。为此,Facebook 开发了 Business SDK,将其许多 API 捆绑到一个 SDK 中,以简化实施和维护。Business SDK 是 Marketing API SDK 的升级版,其中包括 Marketing API 以及来自不同平台(如 Pages、Business Manager、Instagram 等)的许多 Facebook API。快速入门商业SDK入门指南Python 目前是我们第三方开发人员最常用的语言。是一个 Python 包,它提供了您的 Python 应用程序与Business SDK 内的 Facebook APIfacebook_business之间的

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 公交车调度的运作数学模型 共12页.pdf

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 公交车调度的运作数学模型 共12页.pdf

    基于smart-socket实现的轻量级http服务器

    smart-http 是一款可编程的 Http 应用微内核,方便用户根据自身需求进行 Server 或 Client 的应用开发。支持GET、POST的 HTTP 请求。提供了 URL 路由组件,可以快速搭建一套静态服务器。支持部分 RFC2612 规范,后续会逐渐完善。支持 Https 协议,由 smart-socket 为其赋能。具备文件上传的能力。支持 websocket、Cookie支持 Server、Client 开发

    新闻资讯系统 微信小程序+SpringBoot毕业设计 源码+数据库+论文+启动教程.zip

    新闻资讯系统 微信小程序+SpringBoot毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1oiBpYcEBp

    高校师生工作室-JAVA-基于微信小程序的高校师生工作室管理系统的设计与实现

    高校师生工作室-JAVA-基于微信小程序的高校师生工作室管理系统的设计与实现

    基于java的常见小儿疾病中医护理系统设计与实现.docx

    基于java的常见小儿疾病中医护理系统设计与实现.docx

    本教程播放列表涵盖了 Python 中的数据结构和算法 每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习 .zip

    本教程播放列表涵盖了 Python 中的数据结构和算法。每个教程都有数据结构或算法背后的理论、BIG O 复杂性分析和可供练习的练习。使用 Python 的数据结构和算法本教程涵盖了 Python 中的数据结构和算法。每个教程都包含数据结构或算法背后的理论、BIG O 复杂度分析以及可供练习的练习。要观看视频,您可以访问播放列表https://www.youtube.com/playlist?list=PLeo1K3hjS3uu_n_a__MI_KktGTLYopZ12订阅 codebasics youtube 频道https://www.youtube.com/c/codebasics

    数学建模学习资料 蒙特卡罗方法课件教程 第2章.随机数 共29页.pptx

    数学建模学习资料 蒙特卡罗方法课件教程 第2章.随机数 共29页.pptx

    python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业)

    python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。 python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业)python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大三学期的期末大作业、经导师指导并认可通过的高分大作业设计项目,评审分98分。主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业。python实现基于CNN网络的新闻数据集文本分类源码+数据集(Python期末大作业),个人大

    中小学知识产权教育试点学校申报表.doc

    中小学知识产权教育试点学校申报表.doc

    基于django的音乐推荐系统.zip

    基于django的音乐推荐系统.zip

    在建工程涉及专项行动情况检查表.docx

    在建工程涉及专项行动情况检查表.docx

    毕设源码-python-django基于python技术的学生管理系统的设计与开发-期末大作业+说明文档.rar

    本项目是一个基于Python技术的学生管理系统,采用Django框架进行开发,旨在为计算机相关专业的学生提供一个实践性强、功能全面的管理系统,以帮助他们完成毕业设计或进行项目实战练习。 系统实现了对学生信息、课程信息、成绩、考勤等多方面的管理功能。学生信息管理包括学生基本信息的增删改查;课程信息管理允许管理员设置课程信息,包括课程名称、授课老师、学分等;成绩管理功能使学生和教师能够录入、查看和修改成绩;考勤管理则方便教师记录学生的出勤情况。 该项目采用B/S架构,前端使用HTML、CSS、JavaScript等技术,后端使用Python语言和Django框架,数据库采用MySQL。Django框架提供了强大的后台管理功能,使得系统管理更加便捷。 通过开发这个项目,学生不仅能提升自己的编程能力,还能学习到如何构建一个实际应用的系统,对于即将步入职场的学生来说,具有很高的实用价值。

    适用于 Python 的 Splunk 软件开发工具包.zip

    适用于 Python 的 Splunk 软件开发工具包参考文档适用于 Python 的 Splunk Enterprise 软件开发工具包版本 2.1.0适用于 Python 的 Splunk Enterprise 软件开发套件 (SDK) 包含库代码,旨在使开发人员能够使用 Splunk 平台构建应用程序。Splunk 平台是一个搜索引擎和分析环境,它使用分布式 map-reduce 架构来有效地索引、搜索和处理大型时变数据集。Splunk 平台深受系统管理员的欢迎,用于聚合和监控 IT 机器数据、安全性、合规性以及各种其他场景,这些场景都需要有效地从大量时间序列数据中索引、搜索、分析和生成实时通知。Splunk 开发者平台使开发人员能够利用 Splunk 平台所使用的相同技术来构建令人兴奋的新应用程序。开始使用 Python 版 Splunk SDK开始使用 Python 版 Splunk Enterprise SDKSplunk Enterprise SDK for Python 包含库代码,其示例位于splunk-app-examples存储库

    分布式事务练习.zip

    分布式事务练习

    家庭财务管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    家庭财务管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

Global site tag (gtag.js) - Google Analytics