【資料結構】陣列中的最大連續遞增子序列
陣列中的數是亂序的,求出陣列中最大的連續子序列(這裡為遞增)。
方法一:用一個輔助陣列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(≤105);第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(≤105);第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(≤105);第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≤105);第2
5-2 最長連續遞增子序列
給定一個順序儲存的線性表,請設計一個演算法查詢該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。 輸入格式: 輸入第1行給出正整數nnn(≤105\le 10^5≤105);第2行給出nnn個整數