稳定数组的最长数组长度|豆包MarsCode AI 刷题

43 阅读3分钟

问题描述

小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] 则不是。

我们可以使用动态规划的方法来解决这个问题。具体步骤如下:

  1. 初始化一个长度为n的dp数组,其中dp[i]表示以第i个元素结尾的最长稳定子数组的长度。初始时,dp数组中的每个元素都为1,因为每个元素本身至少可以构成一个长度为1的稳定子数组。
  2. 遍历数组,对于每个元素a[i],检查它与前一个元素a[i-1]之间的差的绝对值是否不超过1。如果满足条件,则更新dp[i] = dp[i-1] + 1,否则dp[i]保持为1。
  3. 在遍历过程中,记录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。

知识总结

  • 动态规划:动态规划是一种通过将问题分解为更小的子问题来求解的方法。在这个问题中,我们使用动态规划来记录每个元素结尾的最长稳定子数组的长度。
  • 贪心算法:虽然本题使用了动态规划,但也可以用贪心算法来解决。贪心算法的核心思想是每一步都选择局部最优解,从而希望最终得到全局最优解。在这个问题中,我们可以在遍历数组时,一旦发现不满足稳定条件就截断当前子数组,并更新起始点。

通过上述方法和代码实现,我们可以有效地求解出给定数组中最长的“稳定的”连续子数组的长度。