Leetcode 300 Longest Increasing Subsequence(Python)

题目大意

确定一个未排序数组中最大上升子序列的长度

算法

很简单,没啥可说的。
就是维护一个数组A

  • 如果当前数num比数组A最后一个元素大,那么依旧构成一个上升序列,将其放到数组A最后。
  • 否则,二分查找数组A中第一个比num大的数,用num替换之

最后数组A长度即为该未排序数组的最大上升子序列长度
但要注意该数组并不一定是最大上升子序列

举例

一个数组{3,6,2}
1. 输入3,此时LIS数组为[3]
2. 输入6,此时LIS数组为[3,6]
3. 输入2,2比6小,因此找到它应该插入的位置[2,6]

算法结束,可以看出来最大上升子序列[3,6],长度为2,但该数组为[2,6]并不是其最大上升子序列

代码

class Solution(object):
    def binary_search(self,num):
        start = 0
        end = len(self.LIS) - 1

        if self.LIS[0] > num:
            return 0

        while end-start>1:
            middle = (start+end)/2

            if self.LIS[middle] > num:
                end = middle
            elif self.LIS[middle] < num:
                start = middle
            else:
                return middle

        return end


    def lengthOfLIS(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0


        self.LIS = [nums[0]]

        for i in range(1,len(nums)):
            num = nums[i]

            if num > self.LIS[-1]:
                self.LIS.append(num)
            else:
                index = self.binary_search(num)

                self.LIS[index] = num

        return len(self.LIS)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值