return max(dp)
复杂度分析:
-
时间复杂度: O(n2)
-
空间复杂度: O(n) dp[n]借助的空间
1.2 贪心 + 二分查找
我们要求得最长的上升子序列,那么我们应该保证序列上升的尽可能慢,因此每次添加到子序列后的数尽可能地小。
基于上面的想法,维护一个数组d[i],表示长度为i的最长上升子序列,且d[i]为满足长度为i的上升子序列的最小值,使用len记录数组d的元素个数,初始值d[0] = num[0]。
算法流程:
-
遍历数组nums,当遍历到nums[i]时:
-
若nums[i] > d[len],直接加入到数组末尾,len+1
-
否则,在d数组中寻找第一个大于nums[i]的位置,将其插入
-
以序列[0,2,5,3,7,101,18]
-
第一步插入0:d = [0]
-
第二步插入2:d = [0,2]
-
第三步插入5:d = [0,2,5]
-
第四步更新长度为3的最长子序列的末尾值:d = [0,2,3]
-
第五步插入7:d = [0,2,3,7]
-
第六步插入101:d = [0,2,3,7,101]
-
第四步更新长度为5的最长子序列的末尾值:d = [0,2,3,7,18],得到最长递增子序列长度为5
def findNumberOfLIS(nums):
d = []
for n in nums:
if not d or n > d[-1]:
d.append(n)
else:
left, right = 0, len(d) - 1
while left < right:
mid = left + (right - left) // 2
if d[mid] < n:
left = mid + 1
else:
right = mid
d[left] = n
return len(d)
复杂度分析:
-
时间复杂度: O(nlogn) 使用了二分查找
-
空间复杂度: O(n) d[n]借助的空间
2.1 动态规划
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-W4eYLSkB-1710919907504)]