題目:
給定乙個無序的陣列,返回其中最長遞增子串行的長度。
解法:
利用乙個輔助陣列1,記錄每個長度的lis的結尾字元,最後其長度就是所求值;
輔助陣列2,與1同步變化,記錄陣列1中每個元素在輸入序列中的原始下標;
輔助陣列3,與輸入陣列等長,記錄每個元素在乙個lis中的前驅下標。
**:
1int binsearch(const vector &tail, int len, int key) //
輔助函式,二分查詢,找出key或者第乙個大於key的下標216
17return left; //
如果不存在key,則返回第乙個大於key的元素下標18}
1920
void lis(int *a, int
n)21
42else
4349}50
51 stack stk; //
用棧,因為記錄的路徑是逆序的
52for(int cur = orig[len - 1]; cur >= 0; cur =prev[cur])
5356
57 cout << len <58while(!stk.empty())
5963 cout <64 }
陣列最長遞增子串行
這個問題和矩陣相乘比較相似,但因為它只需要計算a 1.j 的代價,因此比矩陣相乘少了一層迴圈,矩陣相稱的複雜度是n的3次方,這個問題的複雜度是n平方的。要把資料列印出來,破費了一點周折,需要好好理解,其中遞迴退出的條件是,陣列記錄的位置和自身的位置相同,但這個位置的資料也要輸出,因此在else語句中...
陣列中最長遞增子串行
陣列是亂序的,如1,1,2,3,4,5,6,7 根據無後效性定義,陣列中當前元素所形成的子串行與其前面元素形成的子串行沒有關係,所以 lis i 1 max 1,lis k 1 其中,array i 1 arry k 且任意k i lis i 儲存對於當前陣列arry i 形成的最長子序列的長度值,...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...