給定乙個整數序列,找到最長上公升子串行(lis),返回lis的長度。
給出[5,4,1,2,3]
,lis 是[1,2,3]
,返回3
給出[4,2,4,5,3,7]
,lis 是[2,4,5,7]
,返回4
要求時間複雜度為o(n^2) 或者 o(nlogn)
最長上公升子串行的定義:
最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。
定義乙個特殊的dp陣列,儲存子串行在給定陣列中的結束座標和子串行的長度。[子串行結束座標, 子串行的長度]
1、第乙個元素為[0, 1],座標為0,因為是自身,所以長度為1
2、對剩餘元素進行處理,將i之前的dp陣列,按照子串行長度進行排序tmp,然後讓nums[i]和排序後的dp元素依次比較,如果大於dp元素,則dp[i] = [i, tmp[j][1] + 1],跳出迴圈。
3、如果對排序的dp陣列tmp遍歷完也沒有滿足條件,則該數字的以自身為結束座標,長度為1
4、返回dp陣列中長度最大的值。
class solution:
"""@param nums: an integer array
@return: the length of lis (longest increasing subsequence)
"""def longestincreasingsubsequence(self, nums):
# write your code here
if len(nums) < 2:
return len(nums)
dp = [[0, 0] for _ in range(len(nums))]
dp[0] = [0, 1]
for i in range(1, len(nums)):
tmp = sorted(dp[:i], key = lambda x: x[1], reverse = true)
for j in range(i):
if nums[i] > nums[tmp[j][0]]:
dp[i] = [i, tmp[j][1] + 1]
break
elif j == i-1:
dp[i] = [i, 1]
return max(dp, key = lambda x: x[1])[1]
lintcode 76 最長上公升子串行
最長上公升子串行的定義 最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。給出 5,4,1,2,3 lis 是 1,2,3 返回 3 給出 4,2,4,5,3,7 lis 是 2,4,5,7 返回 4建立乙個陣列dp,dp i 表...
lintcode 76 最長上公升子串行
給定乙個整數序列,找到最長上公升子串行 lis 返回lis的長度。說明最長上公升子串行的定義 最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。樣例給出 5,4,1,2,3 lis 是 1,2,3 返回 3 給出 4,2,4,5,...
76 最長上公升子串行
原題 您在真實的面試中是否遇到過這個題?是 最長上公升子串行問題是在乙個無序的給定序列中找到乙個盡可能長的由低到高排列的子串行,這種子串行不一定是連續的或者唯一的。給出 4,2,4,5,3,7 lis 是 2,4,5,7 返回4 標籤 二分法動態規劃 dp o n 2 思路 動態規劃,dp i 為以...