47~541连接更新‘

This commit is contained in:
XuDaHaoRen
2021-08-23 19:45:17 +08:00
parent acf1a54f8d
commit 0a8191b5c3
103 changed files with 491 additions and 669 deletions

View File

@@ -8,13 +8,13 @@
## 300.最长递增子序列
题目链接:https://leetcode-cn.com/problems/longest-increasing-subsequence/
[力扣题目链接](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
 
示例 1
输入nums = [10,9,2,5,3,7,101,18]
输出4
@@ -27,7 +27,7 @@
示例 3
输入nums = [7,7,7,7,7,7,7]
输出1
 
提示:
* 1 <= nums.length <= 2500
@@ -215,9 +215,9 @@ const lengthOfLIS = (nums) => {
1. if(nums[i]>list[len-1],此时list中子序列长度为1到len的对应的最右端最小值不变并新增长度为len+1的子序列最右端的最小值为nums[i],时间复杂度O(1);
2. if(nums[i]<=list[len-1])此时我们可以在0到len-1范围内找到k,list[k]为>=nums[i]的最小值,由于list单调递增所以我们可以使用二分搜索在O(logn)的时间复杂度内找到k。
1. 对于0<=j<k,list[j]<nums[i]恒成立对应list[j]的值不需要更新
2. 对于list[k]其值更新为nums[i],因为原本list[k]对应的子序列的倒数第二项的值可以=list[k-1]<nums[i]。
3. 对于k<j<=len-1,对应的list[j]不需要更新因为这些list[j]对应的子序列的倒数第二项的值>nums[i];
1. 对于0<=j<k,list[j]<nums[i]恒成立对应list[j]的值不需要更新
2. 对于list[k]其值更新为nums[i],因为原本list[k]对应的子序列的倒数第二项的值可以=list[k-1]<nums[i]。
3. 对于k<j<=len-1,对应的list[j]不需要更新因为这些list[j]对应的子序列的倒数第二项的值>nums[i];
3. 综上算法时间复杂度为O(nlogn),空间复杂度为O(n),需要O(n)的空间保存list。