假设我们有一个称为nums的数字列表,我们必须找到最长的递增子序列的长度,并假设子序列可以环绕到列表的开头。
因此,如果输入类似于nums = [6、5、8、2、3、4],则输出将为5,因为最长的递增子序列为[2、3、4、6、8]。
为了解决这个问题,我们将遵循以下步骤-
a:=生成一个大小为nums的大小的列表,并两次填充nums
回答:= 0
对于范围从0到nums的i,执行
n:= a [j]
k:=最左边的索引以将n插入dp
如果k与dp的大小相同,则
除此以外,
ans:= ans的最大值和dp的大小
在dp的末尾插入n
dp [k]:= n
dp:=一个新列表
对于范围i到数量num + i-1的j
返回ans
让我们看下面的实现以更好地理解-
import bisect class Solution: def solve(self, nums): a = nums + nums ans = 0 for i in range(len(nums)): dp = [] for j in range(i, len(nums) + i): n = a[j] k = bisect.bisect_left(dp, n) if k == len(dp): dp.append(n) else: dp[k] = n ans = max(ans, len(dp)) return ans ob = Solution()nums = [4, 5, 8, 2, 3, 4] print(ob.solve(nums))
[4, 5, 8, 2, 3, 4]
输出结果
5