题目如下:
在思考的过程中,非常不全面,每次都需要提交一下才能知道哪一方面没有考虑
没有考虑到的方面如下:
(1)未考虑list中元素全一样的情况:用list.count( )函数解决,如果list.count( ) = len(list),就说明list中元素一样
(2)未考虑list中,有两段以上连续的序列:用flag来记录连续序列的长度,并存入index中,全部遍历完毕,取Max(index)
(3)未考虑list是一个空的
最后通过提交的代码如下,很冗长
def findLengthOfLCIS(self,nums):
"""
:type nums: List[int]
:rtype: int
"""
length = len(nums)
index = []
if length >= 1:
key = nums.count(nums[0])
if key == length:
return 1
else:
flag = 1
for i in range(length):
j = i + 1
while j < length:
if nums[i] < nums[j] and j <= length - 1:
flag += 1
break
else:
if i < length -1:
index.append(flag)
flag = 1
break
else:
return max(index)
index.append(flag)
return max(index)
else:
return 0
在用pycharm进行debug的时候,在python上存在以下几个问题:
- break 和continue不是很清楚
- 对于判断list的遍历索引的值上还需要多加练习
在另外一位博主那里看到了很简洁的方法,说是使用了动归(并不知道是什么),用IDEdebug了一下才看懂是怎样实现的:
代码如下:
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if nums==[]:
return 0
N = len(nums)
Dp = [1]*N
for i in range(N-1):
for j in range(0,i+1):
if nums[i+1]>nums[j]:
Dp[i+1] = max(Dp[i+1],Dp[j]+1)
return max(Dp)
思路:用Dp来存储nums中0~i个最长连续递增序列的个数,比如Dp[3]表示,nums中0~3个元素的最长递增序列个数
举一个具体的例子便于理解:
nums=[5,6,7,3,2,1]
Dp[0] = 1,Dp[1] = 2,Dp[2] =3,Dp[3] =3(因为在nums[3]之前最长的递增序列仍然是3,这一步是通过Dp[i+1] = max(Dp[i+1],Dp[j]+1)来实现的,同样的,Dp[4] =3 ,Dp[5] = 3
最后只要返回Max(Dp)就可以,使用了插入排序的方法,只是加入了存储最长序列个数的Dp