python 动态规划 最短和为给定数值的连续_python leetcode 最长连续递增序列 动态规划算法...

本文介绍了如何使用Python的动态规划算法解决LeetCode上的最长连续递增序列问题。通过示例代码和思路解析,阐述了动态规划的状态转移方程和解题关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python leetcode 最长连续递增序列 动态规划算法

题目链接

https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/

题目介绍

最长连续递增序列 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]

输出:3

解释:最长连续递增序列是 [1,3,5], 长度为3。

尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

Dynamic Programming

class Solution:

def findLengthOfLCIS(self, nums: List[int]) -> int:

n = len(nums)

# 初始化

dp = [1] * n

if not nums:

return 0

for i in range(1, n):

if nums[i] > nums[i - 1]:

dp[i] = dp[i - 1] + 1

return max(dp)

思路

很多时候,感觉是可以用DP去做的,一开始基例还行,到状态转移方程这就没有状态了,继而导致这一道题卡住。接下来,讲一下,动态规划的一般步骤

在本题显然把它分为子问题去做泡汤了,因为它要进行的操作并不明显。所以采用array and replace

定义

dp数组的定义是至关重要的一步,这里我们定义为nums数组到nums[i](包含)的最大子序列长度,一般可从问题出发,问什么就是什么意思,具体细微处修改即可。

举个例子,比如 nums = [1,3,5,4,7],那么dp[3] = 3

初始值

最坏的情况是第二个就小于第一个,那么只有第一个,所以初始值均为1

数归求通项

如果递增,是不是就等于前一个加一呢,那么,读者有疑惑的地方在于如果中间递减了呢,那么不加任何操作。它初始还是1,后面递增,再加上去。最后直接求max(dp),轻轻松松。

注意点

本题nums可为空,所以有了一开始if的判断

然后如果一开始直接判断成功return值,后面的语句即便是可执行也会一概不看

滚动窗口

一般来说,子序列问题都可以用滚动窗口以及双指针的方法做

class Solution:

def findLengthOfLCIS(self, nums: List[int]) -> int:

ans, anchor = 0, 0

n = len(nums)

for i in range(n):

if i and nums[i] <= nums[i - 1]:

anchor = i

ans = max(ans, i - anchor + 1)

return ans

思路

如果乖乖递增,anchor为0,等于没有,那么i + 1即为长度

如果出现递减现象,那么anchor = i减一下变为0,长度为1,可以比喻为从当前地方重新开始

同样的,本题采用了自对抗的方式,首先设置一个answer = 0然后不断取最大

注意点

之所以这个方法没有像之前的设置判断语句,是因为就算整个for控制的结构失效了,ans的初始值还是为0

另外,有读者说了,for遍历我设置成(1,n)不也一样嘛,

但是请读者想一下如果nums = [1]呢,改了之后,if 判断语句会多出一个nums[1],而本身nums只有一个元素

双指针

class Solution:

def findLengthOfLCIS(self, nums: List[int]) -> int:

n = len(nums)

if not nums:

return 0

tem_res = 1

res = 0

for i in range(1, n):

if nums[i] > nums[i - 1]:

tem_res += 1

else:

res = max(res, tem_res)

tem_res = 1

return max(res, tem_res)

思路

这道题一开始用这种方法棘手的原因在于,碰到边界就要重置,但是前面万一一直递增结果怎么办

这种解法就提供了一个好的方法:

一个暂时的结果,一个是结果

如果递增,暂时结果不断加1

如果开始递减,赶快把前面递增的成果保留到res里面,然后从容地重置为1

注意点

最后不能直接return res,万一后面增的更厉害呢,所以还要对抗一下

还有初始值的设定,0还是1还是别的具体依题目而定

拓展

子序列问题可以用双指针和滚动窗口

python leetcode 最长连续递增序列 动态规划算法 相关文章

Python函数作用域名字空间,locals的原理。

最近在回看《Python学习笔记》看到函数这一章节,书中P153页。 书中介绍了函数的每次调用,都会新建栈帧,用于局部变量和执行过程的存储。 等执行结束,栈帧内存被回收,同时释放相关对象。 以字典实现的名字空间,虽然灵活,但存在访问效率低下等问题。这对

python leetcode 最长递增子序列 动态规划算法

题目链接 https://leetcode-cn.com/problems/longest-increasing-subsequence/ 题目介绍 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。

python leetcode 爬楼梯 动态规划算法

题目链接 https://leetcode-cn.com/problems/climbing-stairs/ 题目介绍 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解

python leetcode 连续子数组的最大和 动态规划算法

题目链接 https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/ 题目介绍 剑指 Offer 42. 连续子数组的最大和 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为O(n)。 示例1:

python leetcode 俄罗斯套娃信封问题 动态规划算法

题目链接 https://leetcode-cn.com/problems/russian-doll-envelopes/ 题目介绍 俄罗斯套娃信封问题 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里

python leetcode 动态规划 递归算法 汉诺塔

题目链接 https://leetcode-cn.com/problems/hanota-lcci/ 题目介绍 面试题 08.06. 汉诺塔问题 在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只

python leetcode 斐波那契数列 动态规划 递归 算法

题目链接 : https://leetcode-cn.com/problems/fibonacci-number/ 斐波那契数,通常用F(n)表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0 , F(1)= 1 F(n) = F(n - 1) + F(n - 2) ,

Python 运算符,关于运算符实现和原理

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文章来自腾讯云 作者:python学习教程 想要学习Python有问题得不到第一时间解决来看看这里“1039649593”满足你的需求,资料都已经上

python leetcode 编辑距离 动态规划算法

题目链接 https://leetcode-cn.com/problems/edit-distance/ 题目介绍 编辑距离 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1:

python获取主机ip

在网上搜了一下,有两个方法可以使用。参考来源:https://www.chenyudong.com/archives/python-get-local-ip-graceful.html#IP 第一个方法:通过hostname获取本机ip import socketprint(socket.gethostbyname(socket.gethostname())) 这个方法是通过获取host

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值