问题描述
小R定义一个数组为“稳定的”,当且仅当数组中相邻两个元素之差的绝对值不超过1。例如,数组 [2,3,2,2,1] 是稳定的,而 [1,3,2] 则不是。小R拿到一个数组,她想知道这个数组中最长的“稳定的”连续子数组的长度是多少。你能帮她解答吗?
测试样例
样例1:
输入:
n = 5 ,a = [2, 4, 2, 3, 2]
输出:3
样例2:
输入:
n = 6 ,a = [1, 2, 2, 3, 4, 1]
输出:5
样例3:
输入:
n = 7 ,a = [5, 5, 6, 7, 7, 6, 5]
输出:7
要解决小R的问题,我们需要找到给定数组中最长的“稳定的”连续子数组的长度。根据定义,一个数组是“稳定的”,当且仅当数组中相邻两个元素之差的绝对值不超过1。例如,数组 [2,3,2,2,1] 是稳定的,而 [1,3,2] 则不是。
我们可以使用动态规划的方法来解决这个问题。具体步骤如下:
- 初始化一个长度为n的dp数组,其中dp[i]表示以第i个元素结尾的最长稳定子数组的长度。初始时,dp数组中的每个元素都为1,因为每个元素本身至少可以构成一个长度为1的稳定子数组。
- 遍历数组,对于每个元素a[i],检查它与前一个元素a[i-1]之间的差的绝对值是否不超过1。如果满足条件,则更新dp[i] = dp[i-1] + 1,否则dp[i]保持为1。
- 在遍历过程中,记录dp数组中的最大值,这个最大值即为所求的最长稳定子数组的长度。
以下是Python代码实现:
def solution(n: int, a: list) -> int:
if n == 0:
return 0
dp = [1] * n # 初始化dp数组,每个元素至少是一个稳定的子数组
for i in range(1, n):
if abs(a[i] - a[i-1]) <= 1:
dp[i] = dp[i-1] + 1
return max(dp)
# 测试样例
print(solution(n = 5, a = [2, 4, 2, 3, 2]) == 3)
print(solution(n = 6, a = [1, 2, 2, 3, 4, 1]) == 5)
print(solution(n = 7, a = [5, 5, 6, 7, 7, 6, 5]) == 7)
题目解析与知识总结
题目解析
题目要求我们找到一个数组中最长的“稳定的”连续子数组的长度。所谓“稳定”,是指数组中相邻两个元素之差的绝对值不超过1。例如,数组 [2,3,2,2,1] 是稳定的,因为相邻元素之差不超过1;而数组 [1,3,2] 则不是稳定的,因为1和3之间的差超过了1。
知识总结
- 动态规划:动态规划是一种通过将问题分解为更小的子问题来求解的方法。在这个问题中,我们使用动态规划来记录每个元素结尾的最长稳定子数组的长度。
- 贪心算法:虽然本题使用了动态规划,但也可以用贪心算法来解决。贪心算法的核心思想是每一步都选择局部最优解,从而希望最终得到全局最优解。在这个问题中,我们可以在遍历数组时,一旦发现不满足稳定条件就截断当前子数组,并更新起始点。
通过上述方法和代码实现,我们可以有效地求解出给定数组中最长的“稳定的”连续子数组的长度。