1. 程式人生 > >【資料結構】陣列中的最大連續遞增子序列

【資料結構】陣列中的最大連續遞增子序列

陣列中的數是亂序的,求出陣列中最大的連續子序列(這裡為遞增)。

方法一:用一個輔助陣列list[length],記錄下陣列中每個元素對應的最大連續序列長度,預設為1,即從該元素後沒有連續的序列。當i元素比i-1個元素大時,則將i-1個元素的最大子序列長度加1即為第i個元素的最大序列長度。最後從list[]陣列中找到最大的值max,即為該陣列的最大連續子序列。

該方法的優點是思路清晰,程式碼簡介易懂;缺點是需要一個額外的陣列空間list[].演算法的複雜度為O(n*n).

#include<iostream>
using namespace std;

int List_length(int a[],int length)
{
	int *list = new int[length];
	int i,j;
	list[0] = 1;
	for(i=1;i<length;++i)
	{
		j = i-1;
		list[i] = 1;
		if(a[i]>a[j] )//&& list[j]+1>list[i]
			list[i] = list[j]+1;
	}
	int max  = 0;
	for(i=0;i<length;++i)
	{
		if(list[i]>max)
			max = list[i];
	}
	return max;

}

void main()
{
	int a[5] = {-2,-1,3,4,0};
	int num = List_length(a,5);
	cout<<"The Maximum subsequence's length is:"<<num<<endl;
	system("pause");
}

執行的結果為:


方法二:採用兩個指標p,q遍歷陣列,從第一個元素開始,p指向第一個元素,q指向p的下一個元素,如果陣列是遞增的,則q依次++後移,用max記錄遞增區間。當遇到不再是遞增的區間時,判讀此時q-1到p之間的區間長度是否大於max,更新max。將p移動到q的位置,q再依次的後移進行比較。當q移動到陣列最後時還是遞增的,則判斷q和p之間的長度是否大於max,更新max。期間可以用i,j來記錄最長區間的起始和終止位置。

該方法的時間複雜度更低,而且不需要額外的陣列空間,只需一個Max進行記錄最大區間長度。而且可以記錄下最大區間的起始和終止位置,輸入該段子區間。

#include<iostream>
using namespace std;
int i,j;
int List_length(int a[],int length)
{
	int max=0;
	int p=0,q;
	
	for(q=1;q<length;++q)
	{
		if((a[q]<a[q-1]))//當不再是遞增的時候,這裡兩數相等的情況沒有考慮
		{
			if((q-1-p)>max)//新的遞增長度比原來遞增的長度長時,修改儲存的數;長度相等的情況也沒有考慮
			{
				i=p;
				j=q-1;
				max=j-i+1;				
			}
			p=q;//將p指向新的起點
		}
		else if(q==length-1)//判斷q走到結束的時候,前面是亂序,後面是遞增的情況。
		{
			if(q-p+1>max)
			{
				i=p;
				j=q;
				max=j-i+1;			
			}
		}
/*		else if((q-p)==length-1)//這裡是全部都是遞增的情況
		{
			i=p;
			j=q;
			max=j-i+1;		
		}*/
	}
	return max;
}

void main()
{
	int a[7] = {10,-1,3,4,5,6,0};

	int max = List_length(a,7);
	cout<<"The Maximum subsequence's length is:"<<max<<endl;
	cout<<"The Maximum subsequence is:";
	for(int n=i;n<=j;++n)
		cout<<a[n]<<" ";
	system("pause");
}

執行結果為:


相關推薦

資料結構陣列連續遞增序列

陣列中的數是亂序的,求出陣列中最大的連續子序列(這裡為遞增)。 方法一:用一個輔助陣列list[length],記錄下陣列中每個元素對應的最大連續序列長度,預設為1,即從該元素後沒有連續的序列。當i元

陣列中和遞增序列

問題描述 Maximum Sum Increasing Subsequence 給定一個序列,找到這個序列的一個和最大的子序列,使得子序列的所有元素是升序的,且元素之間的相對位置不變(元素可以在原陣列中不相鄰,但是相對位置不變) 比如, LIS for

一組數連續遞增序列個數

題意:有一組數,如,1,2,3,-2,4,6,10,求該組數中最長連續遞增子序列的個數,顯然這道題的答案是從-2到10一共4個數,所以結果為4. 解析:這道題最直觀的方法就是用兩個巢狀的迴圈,遍歷的過程中,噹噹前數比上一個數大時,則計數變數加1,否則退出內層迴圈,將計數變數

資料結構單源短路徑 Dijkstra演算法

單源最短路徑問題是指:對於給定的有向網路G=(V,E),求原點V0到其他頂點的最短路徑。 按照長度遞增的順序逐步產生最短路徑的方法,稱為Dijkstra演算法。 該演算法的基本思想: 把圖中的所有頂點分成兩組,第一組包括已確定最短路徑的頂點,初始時只含有一個源點,記為集合S;第

資料結構C語言基礎練習:棧的初始化,壓棧,出棧,遍歷,清空

隨手練習一下,詳細程式碼解釋都在程式碼片裡請仔細看看 如果有什麼不對的地方,請在下方留言 先建立標頭檔案: #define _CRT_SECURE_NO_WARNINGS 1 #ifndef _TEST_H #define _TEST_H //棧的鏈式儲存結構;

資料結構圖(短路徑Dijkstra演算法)的JAVA程式碼實現

最短路徑的概念最短路徑的問題是比較典型的應用問題。在圖中,確定了起始點和終點之後,一般情況下都可以有很多條路徑來連線兩者。而邊或弧的權值最小的那一條路徑就稱為兩點之間的最短路徑,路徑上的第一個頂點為源點,最後一個頂點為終點。圖的最短路徑的演算法有很多,本文主要介紹狄克斯特拉(

資料結構陣列、連結串列、棧、佇列、二叉樹

陣列 陣列儲存的資料在地址空間上是連續的。 方便資料的查詢,查詢資料的時間複雜度為O(1)。 連結串列 連結串列儲存的資料在地址空間上可連續,可不連續。 連結串列中的每一個節點都

陣列和的陣列

題目:輸入一個整型陣列,資料元素有正數也有負數,求元素組合成連續子陣列之和最大的子陣列,要求時間複雜度為O(n)。例如:輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,最大和的連續子陣

資料結構-連續遞增序列

7-9 最長連續遞增子序列 (20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤10​5​​);第2行給出n個整數,其間

浙大版《資料結構》習題3.4 連續遞增序列(20 分)

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤105)n(≤105);第2行給出n個整數,其間

LeetCode -- 連續乘積序列

solution leet 推公式 name class return pre [0 連續 問題描寫敘述: 給定數組,找出連續乘積最大值的子序列。比如 0,-1,-3。-2。則最大連續乘積為6= (-3) * (-2)實現思路此題與最大連續和的子序列問題相似,也可通過找到

習題3.4 連續遞增序列(20 分)浙大版《數據結構(第2版)》題目集

space align font list 格式 ott mar 不能 第一次 給定一個順序存儲的線性表,請設計一個算法查找該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入

Super Jumping! Jumping! Jumping! (求遞增序列的和,不用連續)

Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little

7-7 連續遞增序列(20 分) 普通STL解出

這道題我看了一下  決定寫。 在寫之前網上看到很多高手的題解,深表敬意。 只是我想用STL來完成一下這道題。 7-7 最長連續遞增子序列(20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,

連續遞增序列(java)

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤10​5​​);第2行給出n個整數,其間以空格分隔。 輸出格式:

5-3 連續遞增序列 (20分)

5-3 最長連續遞增子序列   (20分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(

7-7 連續遞增序列(20 分)

7-7 最長連續遞增子序列(20 分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數n(≤10​5​​);第2行給

習題3.4 連續遞增序列(20 分)

#include<stdio.h> int main() {   int n,i=0;   scanf("%d",&n);   int num[100001]={0,0,};   while(n-->0)       scanf("%d",&

天梯賽2 重現5-4 連續遞增序列

原題(20分) 給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數nnn(≤105\le 10^5≤10​5​​);第2

5-2 連續遞增序列

給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數nnn(≤105\le 10^5≤10​5​​);第2行給出nnn個整數