1、請給出乙個o(nlogn)的演算法,使之能夠找出乙個n個數的序列中最長的單調遞增子串行。
這是演算法導論中的一道課後題。
解法一:利用求最長公共子串行的思想,將n個數的序列a先排序形成乙個有序的序列b,然後利用動態規劃的思想求a與b的最長公共子串行,得到的最長公共子串行就是所求的解。但是我們知道最長公共子串行的解法是o(n2),所以不滿足題目要求,此法不通。
解法二:對包含n個數的序列a,我們使用乙個陣列c,其中c[i]記錄長度為i的所有單調遞增子串行的最小的元素(可能說的不清楚,舉例說明比如a有3個長為2的單調遞增子串行1,2;3,4;5,6;那麼c[2]的值就是2,記錄的是最小的那個子串行的最後乙個元素)。具體的遍歷過程是對於乙個元素a[i],通過二分查詢c(因為c是有序陣列),獲取a[i]的位置flag,比較a[i]與c[flag]的大小,如果小於c[falg]用a[i]替換c[flag],如果大於用a[i]替換c[flag+1]。這樣遍歷一遍就能得到陣列a的最長的公共子串行的長度,但是要獲得最長公共子串行的組成,需要利用第一次遍歷獲得長度,再遍歷一次,在給定的長度時將c中的元素拷貝出來,防止後邊可能進行的破壞。雖然需要遍歷兩邊但是滿足時間複雜度的要求,大家有更好的方法歡迎討論。
2、請給出乙個時間為o(nlgk)、用來將k個已排序鍊錶合併為乙個排序鍊錶的演算法。
lgk我們可以想到要麼通過折半查詢,要麼將將k個數構造成乙個樹形的結構。
將k個排序的鍊錶的指向第乙個元素的指標組成乙個最小堆,每次取最小的乙個元素,獲取最小的元素後將第二元素頂替原來的元素,執行一次max_heapify(),直到某個鍊錶為空,若為空將空鍊錶與最後乙個鍊錶交換同樣執行一次max_heapify()。
Java 演算法題筆記(五)
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個台階。你有多少種不同的方法可以爬到樓頂呢?注意 給定 n 是乙個正整數。示例 1 輸入 2 輸出 2 解釋 有兩種方法可以爬到樓頂。1.1 階 1 階 2.2 階示例 2 輸入 3 輸出 3 解釋 有三種方法可以爬到樓頂。1....
《演算法筆記》02 簡單題
演算法筆記 01 基礎語法 演算法筆記 02 簡單題 二 題目2 回文 三 題目3 英語句反向 開始做題了 主要是公式熟練 輸入 其他進製的數 進製 輸出 對應的十進位制樣例輸入 1103 8樣例輸出 579c 實現 int other 其他進製的數 int jz 進製 cin other jz i...
演算法筆記 刷題2 5
b 習題6 5 陣列元素逆置 c 習題6 6 楊輝三角 d 習題6 12 解密 e 習題6 13 字串比較 f 例題6 1 逆序輸出陣列元素 b 習題6 5 陣列元素逆置 g 例題6 2 陣列求解fibonacci數列問題 h 例題6 3 氣泡排序 i 例題6 4 矩陣轉置 j 例題6 9 字串求最...