您好,登錄后才能下訂單哦!
最長遞歸子序列
設L=<a1,a2,…,an>是n個不同的實數(shù)的序列,L的遞增子序列是這樣一個子序列Lin=<aK1,ak2,…,akm>,其中k1<k2<…<km且aK1<ak2<…<akm。求最大的m值。
1.時間復雜度為O(n2),空間復雜度O(n)的算法
//O(n2) int LIS1(const int arr[], const int size) { vector<int> h; h.push_back(1); int index = 1; int max = 1; while (index < size) { int longest_sub_size = 0; for (int j = 0; j < index; ++j) { if (arr[j] < arr[index] && longest_sub_size < h[j]) { longest_sub_size = h[j]; if (max < longest_sub_size+1) { max = longest_sub_size + 1; } } } h.push_back(longest_sub_size + 1); ++index; } return max; }
2.時間復雜度O(n*log n),空間復雜度O(n)的算法
int BinSearch(int key, int* d, int low, int high) { while(low<=high) { int mid = (low+high)>>1; if(key>d[mid] && key<=d[mid+1]) return mid; else if(key>d[mid]) low = mid+1; else high = mid-1; } return 0; } int LIS(int* a, int n, int* d) { int i,j; d[1] = a[1]; int len = 1; //遞增子序列長度 for(i = 2; i <= n; i++) { if(d[len]<a[i]) j = ++len; else j = BinSearch(a[i],d,1,len) + 1; d[j] = a[i]; } return len; }
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。