数组中最长升序子序列python_Leetcode300. 最长上升子序列 Python实现

本文介绍如何使用Python实现一个高效算法来解决最长递增子序列问题,利用二分查找优化搜索过程。通过定义mylist和maxlen变量,逐步插入并调整序列,确保新元素在已有序列中的最优位置。核心部分是二分查找确定插入位置,以提升时间复杂度。
摘要由CSDN通过智能技术生成

题目要求

思路:

定义一个数组mylist,长度与给定的数组长度相同

对数组进行迭代,依次把数组的值插入mylist中,用maxlen表示当前已经插入数组元素的长度

如果当前的元素在已经插入的元素的某两个值之间,把这个值赋给两个值中较大的(如果当前插入元素为4,已经插入的序列是1,3,6,7,可知4大于3,小于6,如果后续还有5,那么依旧可以与1,3,4,7组成新的递增序列,而6不行)

如果当前的元素比mylist中的所有元素都大,把他加在mylist[已经插入的数组长度]的位置(因为长度比下标多1)

核心代码:

# 定义已经插入的序列的长度

maxlen = 0

# 定义新的列表

mylist = [0] * len(nums)

# 遍历题中的列表

for j in nums:

# 此处用二分查找,因为是排好序的序列,所以每次只与中间值比较

low , high = 0 , maxlen

while low < high:

mid = low + (high - low) // 2

if mylist[mid] < j:

low = mid + 1

else:

high = mid

mylist[low] = j

if low == maxlen:

maxlen += 1

print mylist

return maxlen

完整代码:

class Solution(object):

def lengthOfLIS(self, nums):

"""

:type nums: List[int]

:rtype: int

"""

maxlen = 0

mylist = [0] * len(nums)

for j in nums:

low , high = 0 , maxlen

while low < high:

mid = low + (high - low) // 2

if mylist[mid] < j:

low = mid + 1

else:

high = mid

mylist[low] = j

if low == maxlen:

maxlen += 1

print mylist

return maxlen

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值