給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。
輸入: [1,3,6,7,9,4,10,5,6]
輸出: 6
這一題,我剛開始得思路就是暴力法:
建立乙個陣列,用來記錄它此時所在得最長長度,這個最長長度就是由從前一位開始,向後遍歷,計算最長的長度;如果數值相等就不需要在遍歷了;
很明顯這是乙個o(n^2)的演算法
code:
class solution
else if(nums[i]==nums[j])
}count[i]=temp;
}return max;
}};
下面給出o(nlgn)的演算法:
它用乙個陣列array來記錄,陣列的索引k表示此時最長長度k+1的最小值為array[k];
比如:[1,3,6,7,9,4,10,5,6]
則到9時,array是:[0,1,2,3,4]
到10時,array是:[0,1,5,3,4,6]--------------------此時最長長度就是陣列的最長長度
到6時,array是:[0,1,5,7,8,6]
但是,從這個陣列看,它還是每次都和array中的每個元素進行比較,是怎麼體現二分的呢:
就是,每次新來乙個數,對於array來說,它是排好序的,
從而就將array進行二分和這個新來的數進行比較:
i=0;
j=此時array的最大的索引
while(i < j)
//最終肯定得到i==j,此時i就是那個比num小的最接近的那個數
array[i] = num;
code:
class solution
array[i] = num;
//如果res==j,就說明此時num比目前所有的值都大,那麼最長長度res就加1
if(res == j) res++;
}return res;
}}
這種二分的時間複雜度就為o(nlgn) 最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...
最長遞增子串行
最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...
最長遞增子串行
最長遞增子串行 求乙個字串的最長遞增子串行 如 dabdbf最長遞增子串行就是abdf,長度為4 這是一道基本的動態規劃求解的題目,與此類似的還有 最長公共子串行 分析 用一維陣列dp i 來儲存以a i 為末元素的最長遞增子串行的長度,那麼dp i 至少為1 即包含它本身 往前尋找,如果存在a j...