如一个元祖 (2, 1, 6, 4, 5, 7, 4, 2, 5, 6, 1, 3, 2, 5), 他的最长递增子序列有很多, 比如(1,4,5,7或者1,2,3,5), 他的最长递增子序列长度就是4
解法(一)思路介绍:
可以借助一个辅助数组来完成, 这个辅助数组的主要职责是, 记录遍历到当前数时, 以当前数结尾的元祖的最长递增子序列长度, 通过嵌套两层while循环, 第一层遍历元祖, 第二层遍历辅助数组, 判断当前遍历的元祖项与之前的每一项的大小, 如果, 当前元组项之前有比他小的元祖项, 则找到拥有最长递增子序列的项, 并加一, 就是当前这个元祖项的最长递增子序列长度, 元祖长度为N, 而每次遍历又要遍历当前项之前的每一项, 因此这种算法的时间复杂度为O(N^2)
t = (2, 1, 6, 4, 5, 7, 4, 2, 5, 6, 1, 3, 2, 5)
arr = [1]
i = 1
maxLen = arr[0]
while i < len(t):
temp = []
j = 0
boo = True
while j < len(arr):
if t[j] < t[i]:
temp.append(arr[j])
boo = False
j += 1
if boo:
arr.append(1)
else:
arr.append(max(temp) + 1)
if max(temp) + 1 > maxLen:
maxLen = max(temp) + 1
i += 1
print(maxLen)
解法(二)思路介绍:
定义一个辅助数组, 先将元祖中的第一个数插入数组, 利用嵌套while循环, 外循环遍历元祖, 内循环遍历辅助数组, 在内循环中, 利用二分法, 先查找第一个大于当前元祖遍历项的数, 如果满足条件, 则将该元祖项替换到数组的第一个大于他的数的位置, 如果数组中没有大于当前元祖项的数, 则将该元组项插入到数组中, 这样做就能够保证, 数组始终都是一个正序排列的数组, 并且数组的长度就是一当前遍历项结尾的元祖的最长递增子序列的长度, 因为在内循环中使用的是二分法所以, 这种解法的时间复杂度是O(N*logN)
import math
t = (2, 1, 6, 4, 5, 7, 4, 2, 5, 6, 1, 3, 2, 5)
arr = []
i = 0
while i < len(t):
if i == 0:
arr.append(t[0])
else:
boo = True
low = 0
heigh = len(arr) - 1
while low <= heigh:
mid = math.floor((low+heigh)/2)
if arr[mid] < t[i]:
low = mid + 1
if arr[mid] >= t[i]:
if mid == 0 or arr[mid-1] < t[i]:
arr[mid] = t[i]
boo = False
break
if arr[mid-1] == t[i]:
boo = False
break
else:
heigh = mid - 1
if boo:
arr.append(t[i])
i += 1
print(len(arr))