求一元组中的最长递增子序列的长度(Python)

如一个元祖 (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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IsQtion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值