100題 第四十七題 序列的最長遞增 遞減序列

2021-09-30 15:11:04 字數 1086 閱讀 1825

一,題目

求乙個陣列的最長遞減子串行

比如的最長遞減子串行為

求乙個陣列的最長遞增子串行 比如

的最長遞減子串行為

二,遞增序列長度求解方法

解法一:

時間複雜度為 o(n^2)

遍歷陣列序列,每遍歷乙個陣列元素,則求序列到當前位置 最長的遞增序列數,用temp[i]儲存。

注意,當前的最長遞增子串行受已經遍歷的最長遞增子串行影響,從序列頭 再遍歷到當前位置的前乙個位置,挨個比較 a[j]與a[i](當前元素)大小,遇到小於a[i

]且判斷需要更新

temp[]陣列。

由於這裡僅僅是求,最長遞增序列的長度,所以僅僅用temp[]儲存長度大小。

原始碼:#include using namespace std;

int lis(int array,int n)

} }

int max=temp[0];

for(int k=0;k

為了減少比較次數

採用空間換時間的策略。新增乙個陣列maxv[],max[i]表示所有長度為i的遞增子串行中最大值之間的最小值

nmaxlax記錄當前最長子序列

每次遍歷乙個元素時候,從最長子序列開始遍歷,一直到1 比較當前元素值arr[i] 跟maxv[j]的值,從而更新temp[]最長子序列和nmaxlax和maxv[]的值

原始碼:#include using namespace std;

int lis(int array,int n)

}if(temp[i]>nmaxlis)//在最長子序列時停止 (這時只有乙個最長的)

int resultlen=indexlen;

for (int i=nlen;i>=0;i--)//記錄最長遞減子串行

}for (int i=0;i0);

int start=0;

int end=nlen-1;

while (start<=end)

{ int mid=(start+end)/2;

if(ntarget>a[mid])

end=mid-1;

else if(ntarget

最長遞減子串行 微軟面試100題 第四十七題

題目要求 求乙個陣列的最長遞減子串行 比如的最長遞減子串行為。實現 1 動態規劃,時間複雜度o n 2 include using namespace std const int n 8 int lis int a,int n int main void cout lis a,n endl retu...

第四十七題(求最長遞減子串行)

題目 求乙個陣列的最長遞減子串行比如的最長遞減子串行為 動態規劃經典題目。c includeusing namespace std namespace ms100p 47 的最長遞減子串行為 void printarray int dp,int data,int k int finddecrease...

LeetCode第四十七題 Python實現

title leetcode no.47 categories tags 給定乙個可包含重複數字的序列 nums 按任意順序 返回所有不重複的全排列。示例 1 輸入 nums 1,1,2 輸出 1,1,2 1,2,1 2,1,1 示例 2 輸入 nums 1,2,3 輸出 1,2,3 1,3,2 2...