最长上升子序列

一题目

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4 
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

动态规划:

 /**
        dp[i]: 所有长度为i+1的递增子序列中, 最小的那个序列尾数.
        由定义知dp数组必然是一个递增数组, 可以用 maxL 来表示最长递增子序列的长度. 
        对数组进行迭代, 依次判断每个数num将其插入dp数组相应的位置:
        1. num > dp[maxL], 表示num比所有已知递增序列的尾数都大, 将num添加入dp
           数组尾部, 并将最长递增序列长度maxL加1
        2. dp[i-1] < num <= dp[i], 只更新相应的dp[i]
        **/
def f(nums):
    if not nums:
        return 0
    dp = [nums[0]]
    print(dp)
    n = len(nums)
    for i in range(1, n):
        print('i:',i)
        if nums[i] > dp[-1]:
            dp.append(nums[i])
            print('if dp:',dp)
            continue
        for j in range(len(dp)):
            if nums[i] < dp[j]:
                dp[j] = nums[i]
                print('for if:',dp)
                break
            # else:
            #     nums[i] == dp[j]  # 避免相等的数重复入组
            #     print(nums)
    return len(set(dp))
nums=[10,9,2,5,3,7,101,18]
f1=f(nums)
print(f1)

 贪心算法

def f(nums):
    size = len(nums)
    if size <= 1:
        return size
    dp = [1] * size
    for i in range(1, size):
        for j in range(i):
            if nums[i] > nums[j]:
                # + 1 的位置不要加错了
                dp[i] = max(dp[i], dp[j] + 1)
# 最后要全部走一遍,看最大值
    return max(dp)
nums=[10,9,2,5,3,7,101,18]
f1=f(nums)
print(f1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值