美文网首页
最长上升子序列

最长上升子序列

作者: ChongmingLiu | 来源:发表于2018-08-29 21:03 被阅读19次

O(n2)解法:

# coding: utf-8
import sys


def LIS(arr):
    """
    O(n^2)
    :param arr:
    :return:
    """
    dp = [0] * len(arr)
    max_len = 0
    for i in range(len(arr)):
        dp[i] = 1
        for j in range(i):
            if arr[j] <= arr[i] and dp[j] + 1 >= dp[i]:
                dp[i] = dp[j] + 1
        max_len = max(dp[i], max_len)
    print(max_len)


if __name__ == "__main__":
    arr = [1, -2, 3, 10, -4, 7, 2, -5]
    find_max_sub_sum(arr)

O(n*logn)

# coding: utf-8
import sys


def find_position(arr, left, right, key):
    """
    二分查找
    :param arr:
    :param left:    
    :param right:   
    :param key:
    :return:
    """
    if arr[right] <= key:
        return right + 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] <= key:
            left = mid + 1
        else:
            right = mid
    return left


def LIS_improved(arr):
    """
    O(nlogn)
    :param arr:
    :return:
    """
    record = [0] * len(arr)  # record[i]表示长度为i的LIS结尾元素的最小值
    record[0] = arr[0]
    max_len = 0
    for i in range(1, len(arr)):
        insert_index = find_position(record, 0, max_len, arr[i])
        record[insert_index] = arr[i]
        if insert_index > max_len:
            max_len = insert_index
    print(max_len + 1)


if __name__ == "__main__":
    lis_arr1 = [2, 7, 1, 5, 6, 4, 3, 8, 9]
    lis_arr2 = [3, 1, 2, 6, 4, 5, 10, 7]
    LIS_improved(lis_arr1)
    LIS_improved(lis_arr2)

相关文章

  • 公共子序列问题

    最长公共子序列 最长上升子序列 最长公共上升子序列

  • LintCode 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子序列问...

  • LintCode 最长上升子序列

    题目 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明最长上升子序列的定义:最长上升子序列...

  • 最长上升子序列

    最长上升子序列(Longest Increasing Subsequence) 最长上升子序列方案数

  • LintCode 最长上升子序列

    题目 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问...

  • 76. 最长上升子序列

    描述 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 说明 最长上升子序列的定义: 最长上升子...

  • 76. 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问题是在...

  • lintcode 最长上升子序列

    给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。说明最长上升子序列的定义:最长上升子序列问题是在...

  • 子序列问题

    最长公共子序列 最长上升/下降/不升/不降子序列

  • 算法(04)动态规划

    零钱问题 背包问题 最长公共子序列 最长公共子串 最长上升子序列 最大连续子序列和

网友评论

      本文标题:最长上升子序列

      本文链接:https://www.haomeiwen.com/subject/mrokwftx.html