LeetCode 300 最长上升子序列 Python
题目描述如下:
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入:[10,9,2,5,3,7,101,18]
输出: 4 解释: 最长的上升子序列是[2,3,7,101],
它的长度是4
。
说明:
- 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
- 你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
思路如下:
- 此题可用动态规划求解,a[i]表示以nums[i]为结尾的最长子序列长度,遍历num[i]之前的数并更新a[i]的值
- 此算法的复杂度为n2
代码如下:
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
a=[1]*len(nums)
if len(nums)==0:
return 0
for i in range(1,len(nums)):
for j in range(0,i):
if(nums[i]>nums[j]):
a[i]=max(a[i],a[j]+1)
return max(a)
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
思路如下:
- 遍历整个数组并维护list a
- 具体思想可参考 https://blog.csdn.net/lw_power/article/details/80758674
Python代码如下:
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
a=[1]*len(nums)
if len(nums)==0:
return 0
for i in range(1,len(nums)):
for j in range(0,i):
if(nums[i]>nums[j]):
a[i]=max(a[i],a[j]+1)
return max(a)
"""
a=[]
if len(nums)==0:
return 0
a.append(nums[0])
for i in range(1,len(nums)):
if nums[i]>a[-1]:
a.append(nums[i])
else:
if nums[i]<a[0]:
a[0]=nums[i]
else:
position=self.binarySearch(a,nums[i],0,len(a)-1)
a[position]=nums[i]
return len(a)
def binarySearch(self,a,number,left,right):
if left==right:
return left
while left<right:
mid=(left+right)/2
if mid==left or mid==right:
if number>a[left]:
return right
else:
return left
if number<a[mid]:
return self.binarySearch(a,number,left,mid)
else:
return self.binarySearch(a,number,mid,right)