青训营 X 豆包MarsCode AI 刷题

47 阅读5分钟

子数组和的最大值问题

题目要求我们计算从给定的整数数组中删除任意一个元素后,能得到的长度为 k 的子数组和的最大值。如果数组恰好为 k 个元素,那么不进行删除操作。

具体来说:

  • 输入:一个整数 n(数组的长度),一个整数 k(子数组的长度),以及一个整数数组 nums
  • 输出:删除任意一个元素后,长度为 k 的子数组和的最大值。

例如:

  • 样例1:输入 n = 5, k = 3, nums = [2, 1, 3, -1, 4],输出 8
  • 样例2:输入 n = 6, k = 2, nums = [-1, -1, 5, -2, 3, 4],输出 8
  • 样例3:输入 n = 4, k = 2, nums = [-5, -3, 2, 1],输出 3

这是一道关于数组操作和子数组求和的题目,目标是在给定一个整数数组以及数组长度和指定子数组长度的情况下,通过删除数组中的任意一个元素,找到能得到的长度为指定值 k 的子数组和的最大值。

输入内容及含义

  • 整数 n:表示输入的整数数组 nums 的长度,它界定了数组的范围,我们后续的操作都要基于这个长度来确保不越界。
  • 整数 k:指定了我们要关注的子数组的长度。我们需要在删除一个元素后的数组中找到长度为 k 的子数组,并计算它们的和来寻找最大值。
  • 整数数组 nums:这是题目操作的主体数据结构,我们要从这个数组中进行元素删除操作,并基于删除后的数组来计算满足条件的子数组和。

输出要求

输出一个整数,这个整数代表的是从给定数组中删除任意一个元素后,所能得到的长度为 k 的子数组和的最大值。也就是说,我们需要遍历所有可能删除一个元素的情况,针对每种情况计算出长度为 k 的子数组和,然后从中找出最大值作为最终答案。

示例分析

通过分析题目给出的示例,可以更清晰地理解题目要求:

  • 样例 1:输入 n = 5, k = 3, nums = [2, 1, 3, -1, 4],输出 8

    • 这里数组长度 n 为 5,要找长度 k 为 3 的子数组和的最大值。我们需要依次考虑删除数组中的每一个元素后的情况。比如删除第一个元素 2 后,数组变为 [1, 3, -1, 4],此时长度为 3 的子数组有 [1, 3, -1],其和为 3;再比如删除第二个元素 1 后,数组变为 [2, 3, -1, 4],长度为 3 的子数组 [2, 3, -1] 的和为 4,以此类推。经过对所有删除一个元素后的情况进行计算和比较,最终得到满足条件的最大值为 8。
  • 样例 2:输入 n = 6, k = 2, nums = [-1, -1, 5, -2, 3, 4],输出 8

    • 同样,数组长度 n 为 6,要找长度 k 为 2 的子数组和的最大值。按要求对删除每个元素后的情况进行分析计算,最终得出最大值为 8。
  • 样例 3:输入 n = 4, k = 2, nums = [-5, -3, 2, 1],输出 3

    • 在此例中,数组长度 n 为 4,目标子数组长度 k 为 2。通过遍历删除一个元素后的各种情况并计算相应子数组和,找到的最大值是 3。

解题思路提示

  • 首先要考虑到需要遍历数组中所有元素,模拟删除每个元素后的情况。
  • 对于每次模拟删除一个元素后的新数组,要正确计算出长度为 k 的子数组的和。这里需要注意处理好索引的范围,避免越界错误,比如在确定子数组起始索引时,要根据当前删除元素的位置以及 k 的值来合理计算。
  • 在计算出所有可能情况下的长度为 k 的子数组和之后,从中找出最大值作为最终的输出结果。可以通过一个变量来记录当前找到的最大值,并在每次计算出新的子数组和时与该变量进行比较,若新值更大则更新该变量。

  1. 首先判断数组长度 n 是否等于子数组长度 k,如果相等,说明不需要删除元素,直接返回数组的总和。

  2. 然后初始化 max_sum 为负无穷大,用于存储最终能得到的长度为 k 的子数组和的最大值。

  3. 通过循环遍历数组中的每个元素,对于每个元素 i

    • 先创建一个新的数组 new_nums,它是原数组 nums 删除了第 i 个元素后的数组。
    • 接着计算新数组 new_nums 中长度为 k 的子数组的和,这里要注意索引的范围,通过 max(0, i - k + 1) 来确保索引不越界,然后计算从该索引开始长度为 k 的子数组和 subarray_sum
    • 最后将 subarray_sum 与当前的 max_sum 进行比较,更新 max_sum 的值为较大者。
  4. 循环结束后,返回 max_sum,即为删除任意一个元素后,长度为 k 的子数组和的最大值。