链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。
示例 1:
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。
示例 2:
输入: [2,2,2,2,2]
输出: 1
解释: 最长连续递增序列是 [2], 长度为1。
定义数组
定义 dp[i] 是以数组 nums[i] 为结尾的最长连续递增序列的长度;
递推表达式
如果 nums[i]>nums[i−1],则表明 i 至少可以与 i-1 形成一个连续递增序列,长度为 dp[i-1]+1;
如果 nums[i]<=nums[i-1],此时不能形成连续递增序列;
初始值
当 i=0 时长度为 1,dp[i]=1。
时间复杂度:O(n)
空间复杂度:O(n)
Python:
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
if not nums:
return 0
dp=[1]*len(nums)
for i in range(1,len(nums)):
if nums[i] > nums[i-1]:
dp[i]=max(dp[i],dp[i-1]+1)
return max(dp)
这里我们只用了一个变量,将空间复杂度降为 O(1),其实这里不能很准确的叫动态规划啦,就看作一个普通的遍历吧。
时间复杂度:O(n)
空间复杂度:O(1)
Python:
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
if not nums:
return 0
ans=1
dp=1
for i in range(1,len(nums)):
if nums[i] > nums[i-1]:
dp+=1
else:
dp=1
ans=max(ans,dp)
return ans
Go:
func findLengthOfLCIS(nums []int) int {
if len(nums)==0{
return 0
}
count:=1
maxCount:=1
for i:=1;i<len(nums);i++{
if nums[i]>nums[i-1]{
count++
}else{
count=1
}
maxCount=max(maxCount,count)
}
return maxCount
}
func max(x, y int) int{
if x>y{
return x
}
return y
}
除了动态规划和平常的遍历之外,我们还可以使用贪心来得到最长连续递增序列,其具体做法就是记录当前连续递增序列的开始位置和结束位置,然后在遍历中依次比较相邻元素,根据相邻元素的大小来决定是否更新开始位置。
时间复杂度:O(n)
空间复杂度:O(1)
Python:
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
if not nums:
return 0
ans=0
start=0
for i in range(len(nums)):
if i>0 and nums[i] <= nums[i-1]:
start=i
ans=max(ans,i-start+1)
return ans
Go:
func findLengthOfLCIS(nums []int) int {
if len(nums)==0{
return 0
}
ans:=0
start:=0
for i:=0;i<len(nums);i++{
if i>0 && nums[i]<= nums[i-1]{
start=i
}
ans=max(ans,i-start+1)
}
return ans
}
func max(x, y int) int{
if x>y{
return x
}
return y
}
如果觉得文章不错,希望大家可以点击上方名片关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会及时回复的,同时会不定期更新更多的文章,祝我们终将自由。